2010-07-24 14 views
5

Mam kilka plików zapisanych w C, i chcę, aby były zgodne z C++, więc dla moich nagłówków C używam;C++: funkcje zewnętrzne i inline

#ifdef __cplusplus 
extern "C" { 
#endif 

na początku pliku i oczywiście

#ifdef __cplusplus 
} 
#endif 

... na końcu. Ale wydaje się, że stwarza problemy ze słowem kluczowym "inline". Moim rozwiązaniem jest po prostu usunięcie inline słowa kluczowego dla C++, ale myślę, że może to mieć zły wpływ na programy w C++ (te funkcje są nazywane czasem miliardami).

Czy istnieje lepsze rozwiązanie? Oczekuje się

Odpowiedz

2

Jeśli dobrze rozumiem, chciałbym zrobić:


#ifdef __cplusplus 
#define D_INLINE static 
extern "C" { 
#else 
#define D_INLINE inline 
#endif 

I użyj D_INLINE dla funkcji, które moim zdaniem powinny być wbudowane. Jak powiedział delnan, kompilator i tak to zoptymalizuje, a słowo kluczowe inline jest tylko wskazówką dla kompilatora, który programista uważa, że ​​kompilator powinien wstawiać funkcję. Nie zmusza kompilatora do wstawienia funkcji.

+4

Pojawi się wiele błędów definicji w całym miejscu. Dodatkowo logika jest zacofana: C++ obsługuje słowo kluczowe inline i C89/C90, które tego nie robi. –

+0

Wygląda na to, że działa. W każdym razie, aby być uczciwym, wszystkie kompilatory C i C++, którymi jestem zainteresowany, obsługują słowo kluczowe "inline". Myślę, że problem polega na tym, że w C++ muszę dodać "extern" i powoduje to konflikty z wbudowanym słowem kluczowym. – Suugaku

+0

W standardzie C++ 03 funkcje 'inline' są automatycznie" zewnętrzne ". Czy działa bez 'extern'? –

-2

funkcje inline należy pomnożyć zdefiniowane tak:

#ifdef __cplusplus 
extern "C" { 
#elif __STDC_VERSION__ >= 199901L 
    /* do nothing, C99 supports inline */ 
#else 
# define inline static 
#endif 

Wiele kompilatorów C mają niestandardowe rozszerzenia oznaczyć funkcje jak inline, można również zdefiniować go jako __attribute__((always_inline)) (jeśli __GNUC__ jest zdefiniowana)

EDIT: Dla lepszego i pełniejszego poradę, zobacz: http://www.greenend.org.uk/rjk/2003/03/inline.html

+2

Po pierwsze, OP mówił o problemach w trybie C++, a nie w trybie C. Po drugie, wbudowane funkcje w C++ mają * zewnętrzne * powiązania, a nie "statyczne" (wewnętrzne?) Powiązania. – AnT

+0

Poprawione błędne informacje o sprzężeniu. Ale funkcje inline C++ są zadeklarowane w pliku nagłówkowym, więc zastąpienie 'inline' przez' static' faktycznie działa dość dobrze. –

+1

Również OP nie może po prostu usunąć słowa kluczowego 'inline' lub będzie wiele błędów definicji we wszystkich trybach, nie tylko w C++. –