2016-08-10 40 views
6

mam TRZECIEJ C bibliotekę z anonimowego strukturę podobną doForward deklarując anonimową strukturę z C na C++

typedef struct 
    { 
     ... 
     }A; 

Plik ten jest generowany automatycznie przez program, co można zmienić na podstawie czegoś

teraz w projekcie C++ przyjmuję argumentu powyższego rodzaju, na przykład jako

void foo(const A & in) 
    { 
    ... 
    } 

jak naprzód zadeklarować w nagłówku pliku definiującego powyższą funkcję?

Próbowałem:

typedef struct A A; 

lub

struct A; 

a także

typedef A A; 

z ciekawości.

Jednak powoduje to błąd w czasie kompilacji przedefiniowania typu. Dzięki

+0

Nie można dołączyć pliku nagłówkowego biblioteki, która zdefiniowała 'typedef struct {...} A;'? – rjp

+0

To nie jest anonimowa 'struct' (patrz 6.7.2.1p13 w standardzie C). Nie możesz mieć anonimowego 'struct's poza' struct' lub 'union'. – Olaf

+0

C nie jest C++. Po prostu użyj standardu C++. Nie jest jasne, jaki masz problem, nie widzę żadnego. Na czym polega problem z użyciem nazwy "typedef'? – Olaf

Odpowiedz

6

Niestety nie masz szczęścia.

A to typedef dla nieotagowanego struct. I nie możesz przekazać dalej, że deklarujesz, że nie możesz odnieść się bezpośrednio do tego struct.

Czy można zmienić generator, aby wyświetlał typedef struct A { ... } A;? Wtedy skompilowałaby się dobrze zarówno w C, jak iw C++, a ty mógłbyś forward zadeklarować w C++.

W przeciwnym razie dostępne są dwie opcje: 1. #include plik zawierający deklarację struct. 2. Skopiuj plik struct ręcznie. Oczywiście (1) jest znacznie bardziej preferowany.

+2

To jest nieoznakowana, nieotagowana, nieotagowana struktura. – Olaf

+0

@Olaf: to jest pomocne. Szukałem właściwego terminu. – Bathsheba

+0

Wystarczy, że wyjaśnię: używam terminologii C i po prostu dedukuję: tag brakuje, więc myślę, że "nieoznaczone" byłoby poprawną nazwą. – Olaf

1

Nie można, ponieważ aliasy typów nie mogą być zadeklarowane do przodu. Tylko rzeczywiste typy mogą.