2010-07-24 30 views
5

C dilinde yazılmış birkaç dosyam var ve bunların C++ uyumlu olmasını istiyorum, bu yüzden kullandığım C başlıklarım için; C++: extern ve satır içi işlevler

#ifdef __cplusplus 
extern "C" { 
#endif 
dosyasının başında

ve sonunda tabii

#ifdef __cplusplus 
} 
#endif 

... arasında

. Ancak 'inline' anahtar kelimesiyle sorun yaratıyor gibi görünüyor. Benim çözümüm C++ için inline anahtar sözcüğünü kaldırmaktır, ancak C++ programlarında kötü bir etkiye sahip olabileceğini tahmin ediyorum (bu fonksiyonlara zamanın gazilyonları denir).

Daha iyi bir çözüm var mı?

cevap

2

, ben yapardım:


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

Satırda olması gerekeni düşündüğüm işlevler için D_INLINE kullanın. Delnan'ın dediği gibi, derleyici her halükarda optimize eder ve inline anahtar sözcüğü, derleyicinin, derleyicinin işlevi satır içi olarak yapması gerektiğini düşündüğü bir derleyicidir. Derleyici işlevi satır içi zorlamaz.

+4

Her yerde birden çok tanım hatası alacaksınız. Ayrıca mantık geriye doğru: 'inline' anahtar sözcüğünü ve C89/C90'ı desteklemeyen C++. –

+0

İyi görünüyor. Neyse, adil olmak gerekirse, tüm C ve C++ derleyicileri 'inline' anahtar sözcüğünü desteklemekle ilgileniyorum. Sorun şu ki, C++ ile "extern" eklemem gerekiyor ve satır içi anahtar kelimeyle çakışmalara neden oluyor. – Suugaku

+0

Standart C++ 03'te, "satır içi" işlevler otomatik olarak "extern". Extern olmadan çalışır mı? –

-2

Inline fonksiyonları çarpın, böylece tanımlanmış beklenmektedir:

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

Birçok C derleyicileri satır içi gibi işlevleri işaretlemek için standart dışı uzantıları vardır, ayrıca (__GNUC__ tanımlı ise)

__attribute__((always_inline)) olarak tanımlayabilirsiniz

DÜZENLEME: iyi ve daha kapsamlı tavsiye için, bkz: Eğer doğru anlamak http://www.greenend.org.uk/rjk/2003/03/inline.html

+2

İlk olarak OP, C modunda değil, C++ modunda sorunlar hakkında konuşuyordu. İkinci olarak, C++ 'daki satır içi fonksiyonlar, "statik" (dahili?) Bağlantı değil, * harici * bağlantıya sahiptir. – AnT

+0

Bağlantı ile ilgili yanlış bilgiler düzeltildi. Ancak C++ satır içi işlevleri bir başlık dosyasında bildirilir, bu yüzden "inline" ile "static" ifadesinin değiştirilmesi oldukça iyi çalışır. –

+1

Ayrıca OP, 'inline 'anahtar sözcüğünü de kaldıramaz ya da sadece C++ için değil, ALL modlarında birden çok tanım hatası olur. –