2017-09-12 9 views
5

Pojawiło się pytanie, czy należy opakować extern "C" przy użyciu #if lub #ifdef. tj .:Czy __cplusplus może być kiedykolwiek zdefiniowany i równy zeru?

#if __cplusplus 
extern "C" { 
#endif 

lub

#ifdef __cplusplus 
extern "C" { 
#endif 

Które nasuwa się pytanie: czy kiedykolwiek sytuacja, w której __cplusplus jest zdefiniowana jako równa zeru?

+0

przypadku korzystania z kompilatora C następnie '__cplusplus' nie zostaną zdefiniowane w ogóle - więc myślę, że' # ifdef' jest właściwym wyborem. –

+0

@MarkRansom: Nie jest to konieczne, możesz '#if X', jeśli' X' jest niezdefiniowany, zgodnie z normą. –

Odpowiedz

3

Zgodnie ze standardem zdefiniowanie __cplusplus macro musi być zdefiniowane jako, dokładna definicja zależy od używanego standardu C++, ale nie będzie równa zero.

Na przykład, dla C++ 11 to musi być 201103L, z dopiskiem „Zakłada się, że przyszłe wersje tego standardu zastąpi wartość tego makra o większej wartości.”

Historycznie, w niektórych starożytnych niezgodnych kompilatorach, które prawdopodobnie można wykopać, __cplusplus został zdefiniowany jako 0, aby wskazać niezgodność ze standardem. Jest to tylko kwestia historyczna.

Patrz: How are the __cplusplus directive defined in various compilers?

+0

Rzeczywiście istniały takie kompilatory, a Microsoft Visual C++ był jednym z nich. – EJP

+0

@EJP ciekawe, więc '# ifdef' nie * nie * działałoby z tym kompilatorem, błędnie wskazując, że kompilujesz źródło C++, gdy faktycznie jest to C? –

+0

@EJP lub czy mówisz, że zdefiniował '__cplusplus' jako' 0' dla kompilacji C++? W takim przypadku * musisz * koniecznie użyć '# ifdef', ponieważ' # if' zawiedzie. Teraz jestem coraz bardziej zagubiony. –

Powiązane problemy