2016-02-28 14 views
8

Nella MSDN (https://msdn.microsoft.com/en-us/library/ew2hz0yd.aspx) compaiono i seguenti:Le aree condizionali #if possono includere i limiti dei file?

Tutte le direttive condizionale di compilazione, come #if e #ifdef, deve essere abbinato con chiusura #endif direttive prima della fine del file; in caso contrario, viene generato un messaggio di errore. Quando condizionale-compilazione direttive sono contenute in file di inclusione, essi devono soddisfare le stesse condizioni : Non ci devono essere ineguagliate condizionale-compilazione direttive alla fine del file di inclusione.

Bene, semplice e chiaro. Allo stesso tempo non riesco a trovare qualcosa di simile nello standard C++ 11. La mia domanda è questa limitazione legale?

Capisco perfettamente che la divisione della compilazione condizionale su più livelli #include non è una buona idea e dovrebbe essere evitata.

Qualcuno sa come altri compilatori (GCC, CLANG) gestire questo caso? Forse questo è stato discusso da qualche parte?

+0

È apparentemente chiedi lo standard C++, in modo da non aggiungere tag C. – Olaf

+0

Hai provato cosa succede quando lo fai? – Alex

+4

Bene, questo è rilevante anche per C. Ha standard diversi che possono dire qualcosa di diverso. –

risposta

2
#if FOO 
#include "hashif.h" 


extern "C" int printf(const char* fmt, ...); 

int main() 
{ 
    printf("Hello, World\n"); 
} 

e hashif.h contiene questo:

#define BAR 1 
#else 
#define BAR 2 
#endif 

poi clang ++ dà un errore.

hashif.cpp:1:2: error: unterminated conditional directive 
#if FOO 
^ 
1 error generated. 

Edit: E g++ e cpp tutti si comportano allo stesso modo.

uscita esatta da:

$ cpp hashif.cpp -DFOO=1 
# 1 "hashif.cpp" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "hashif.cpp" 

# 1 "hashif.h" 1 
In file included from hashif.cpp:2:0: 
hashif.h:2:2: error: #else without #if 
#else 
^
hashif.h:3:0: warning: "BAR" redefined 
#define BAR 2 
^ 
hashif.h:1:0: note: this is the location of the previous definition 
#define BAR 1 
^ 
hashif.h:4:2: error: #endif without #if 
#endif 
^
# 3 "hashif.cpp" 2 


extern "C" int printf(const char* fmt, ...); 

int main() 
{ 
    printf("Hello, World\n"); 
hashif.cpp:1:0: error: unterminated #if 
#if FOO 
^ 
} 
+2

hai definito FOO? altrimenti non includerebbe l'intestazione – Anedar

+0

@Anedar: Non importa, (ma dà alcuni altri errori per i '# else' e' # endif' se 'foo' è definito) –

+0

Sarebbe bello aggiungere questi errori alla tua risposta. –

Problemi correlati