2015-04-17 17 views
6

Próbuję znaleźć wszystkie miejsca, w których #include jest umieszczony w bloku externC. Czy można to sprawdzić za pomocą preprocesora? Chciałbym dodać coś nie tak z moimi plikami nagłówka:Jak wykryć, że na zewnątrz działa "C"

#ifdef EXTERN_C_IS_IN_EFFECT 
#error File included from extern "C" block! 
#endif 

Ja również poszukuje innych sposobów Kompilacja W takim przypadku, na przykład użyj jakiegoś specjalnego atrybutu. Używam gcc 4.4.7.

I zdefiniowano następujące makro, a następnie używać go w każdym nagłówku, który potrzebuje ochrony przed włączeniem w externC bloku:

#define ASSERT_NO_EXTERN_C void assert_no_extern_c(int); void assert_no_extern_c(double); 
+7

'extern' nie jest w ogóle zauważany przez preprocesor. –

+1

Jeśli potrzebujesz tego do znalezienia wszystkich plików, w których masz zewnętrzny blok "C", możesz wziąć swój projekt kodu ze wszystkimi plikami, które chcesz przeszukać do swojego ulubionego IDE i zrobić "Szukaj w całym projekcie/rozwiązaniu/..." – Incubbus

+0

@ πάνταῥεῖ Hm. '#define extern static'? –

Odpowiedz

11

Być może można zdefiniować prototypy 2-funkcyjne o tej samej nazwie i różnych parametrach. Otrzymasz ostrzeżenia w przypadku zewnętrznego bloku "C". I jest dozwolone w C++.

+0

Dzięki! To działa dla mnie: void asert_no_extern_c (int); void assert_no_extern_c (podwójne); –

6

to nie jest możliwe, ponieważ preprocesor biegnie przed jakimkolwiek syntaktyczna analiza jest wykonywana; to znaczy, preprocesor nawet nie wie, co to jest extern "C" i jego działanie nie może również zależeć od obecności takiej dyrektywy.

Jednak specyfikacje połączeń są zagnieżdżane, więc zamiast upewnić się, że plik includer nie określił wartości extern "C", można umieścić nagłówek w specyfikacji extern "C++", aby upewnić się, że używa on łącza C++.

Powiązane problemy