Toon posts:

[C++]Pointers naar C++ structs in C

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met het ontwikkelen van een embedded applicatie in C++. Op het embedded platform draait ThreadX, welke als library mee wordt gecompileerd in het image.
In ThreadX is een struct gedefineerd, welke ik als een member variabele declareer in een class in C++. Vervolgens geef ik een pointer naar deze member variabele mee aan een functie van ThreadX.

Mijn vraag in het kort is: kan dit?
Een iets langere versie van de vraag is: Is het mogelijk voor code die gecompileerd is in C, om een variabele die gedeclareerd is door C++, aan te spreken als C++ een pointer naar de variabele geeft aan de C code?

Voor de duidelijkheid hier versimpeld de situatie:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class cppClass
{
public:
  cppClass();
private:
   c_struct a;
};

void c_functie(c_struct* p)
{
  //doe iets met pointer
}

cppClass::cppClass()
{
  c_functie(&a);    //roep de c_functie aan met als argument 
                          //een pointer naar de c_struct, gedeclareerd in c++
}

[ Voor 0% gewijzigd door Verwijderd op 10-05-2007 11:40 . Reden: Layout aangepast ]


Verwijderd

ThreadX is een C-lib? Dan zou er bij mijn weten voor een POD struct geïnstantieerd in het C++ gedeelte geen enkel probleem moeten zijn. Zie de volgende uitbreiding van jouw voorbeeld:

test_c.h:
C:
1
2
3
4
5
6
7
8
9
10
11
12
typedef
struct  c_struct
{
    int m_nData;

} c_struct;


#ifdef __cplusplus
extern "C"
#endif
void c_functie (c_struct *);


test_c.c:
C:
1
2
3
4
5
6
7
8
9
10
11
12
#include  <stdio.h>

#include  "test_c.h"


void
c_functie (c_struct * p)
{
    printf ("[c_functie] Current value (expecting 23): %d\n", p->m_nData);

    p->m_nData = 46;
}


test_cpp.cpp:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include  <cstdio>

#include  "test_c.h"


class   cppClass
{
    public:
        /*con*/  cppClass (void);
    private:
        c_struct  a;
};


/*con*/ cppClass::cppClass (void)
{
    a.m_nData = 23;
    c_functie (&a);
    printf ("[cppClass::cppClass] New value (expecting 46): %d\n", a.m_nData);
}


int
main (void)
{
    cppClass  c;

    return 0;
}

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Er zijn twee dingen die hier spelen. Ten eerste snapt je C compiler natuurlijk geen C++ code, dus hij zal nooit je cppClass kunnen compilen. Voor je C code heb je dan een struct definitie nodig die dezelfde members heeft, en dan kom je op het tweede punt: als je twee verschillende types hanteert (de class voor C++ en een aparte struct voor C) moeten ze wel layout-compatible zijn. En dat geldt alleen voor POD types (een class zonder destructor en user-defined copy assignment operator, met alleen POD-types en C primitive members).

Het makkelijkst is denk ik om in C een struct te definieren met de members die je vanuit je C functie aan wilt spreken, en in C++ van die struct te inheriten of 'm als member te definieren. Het voordeel van inheritance is dat je class converteerbaar is naar die struct en dat je vanuit je class direct de members aan kunt spreken op je this. Je hebt dan ook geen proxy functie meer nodig die een pointer van jouw class omzet in een pointer van de C struct alvorens de C functie aan te roepen.

.edit: refreshen voor posten als ik naar de plee ben geweest 8)7

[ Voor 3% gewijzigd door .oisyn op 10-05-2007 11:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Verwijderd schreef op donderdag 10 mei 2007 @ 11:40:
Dan zou er bij mijn weten voor een POD struct geïnstantieerd in het C++ gedeelte geen enkel probleem moeten zijn.
Dat denk ik dus ook, maar ik weet het niet 100% zeker en ik had wat aparte reacties van mijn applicatie. Ik zou dit vermoeden graag bevestigd willen hebben.
.oisyn schreef op donderdag 10 mei 2007 @ 11:58:
Ten eerste snapt je C compiler natuurlijk geen C++ code, dus hij zal nooit je cppClass kunnen compilen.
De struct is gedefineerd in ThreadX, dus wordt ook in een .c file gecompileerd. De klasse is gecompileerd in een .cpp file, en included de struct definitie uit de andere file. Ik wil alleen een instantie van de struct opnemen in de klasse, en deze aanspreken vanuit een andere c functie.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Je spreekt jezelf tegen een beetje tegen. De struct wordt in een header gedefinieerd, niet in de .c file. Die header wordt eenmaal als C gecompileerd, eenmaal als C++, en dus heb je twee structs. Gebruik extern "C" om te zorgen dat beide kanten het over dezelfde struct hebben.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Dat had ik me niet gerealiseerd, maar het klopt inderdaad. Ik zal zorgen dat dat overheen komt. Dan kan ik verder terwijl ik zeker weet dat dit goed gaat.

Bedankt.
Pagina: 1