2009-07-30 8 views
35

Czy można wydrukować na stderr wartość zmiennej preprocesora w C? Na przykład, co mam teraz jest:Czy jest możliwe wydrukowanie zmiennej preprocesora w C?

#define PP_VAR (10) 
#if (PP_VAR > 10) 
    #warning PP_VAR is greater than 10 
#endif 

Ale co chciałbym zrobić, to:

#define PP_VAR (10) 
#if (PP_VAR > 10) 
    #warning PP_VAR=%PP_VAR% 
#endif 

Czy coś jak to możliwe w C?

Odpowiedz

41

można wydrukować wartości zmiennej preprocesora pod visual studio. Poniższa tabela przedstawia wartość _MSC_VER:

Nie jestem pewien, jak jest to standardowe.

+2

To nie jest standard, ale GCC, MSVC, CLANG ... (prawdopodobnie inni też to wspierają) – ideasman42

0

Cóż, to, co robisz, jest w rzeczywistości niestandardowe. Po pierwsze, dyrektywa "#warning" lub "#warn" nie jest standardem. Po drugie, w przypadku korzystania z preprocesora, linia musi zaczynać się od symbolu funta, bez spacji:

 
#ifdef BLAH1 
# define BLAH2 // OK, because pound is at the very left. 
#endif 

#ifdef BLAH3 
    #define BLAH4 // Works on many compilers, but is non-standard. 
#endif 

Skoro już używasz niestandardowego rozszerzenia, trzeba zajrzeć do dokumentacji danego preprocesora/kompilator, którego używasz, aby zobaczyć, co mówi o "#warning".

+5

Twój drugi punkt nie jest poprawne - C89 podniósł takie ograniczenie. # Musi być pierwszym symbolem na linii, ale może być poprzedzony białą spacją (ale nie komentarzem). –

+0

Dzięki. Nie mogę uwierzyć, że wciąż żyję w ciemnych wiekach. Czy możesz wskazać mi odpowiedni dokument? –

+0

Wow. Przyszedłem później do gry, niż myślałem - nigdy nie wiedziałem o tym ograniczeniu. –

2

pomocą preprocesora operator token-wklejanie: ## token_name

Jak wcześniej zauważono, dyrektywy preprocesora używasz są niestandardowe, więc YMMV.

3

Wiele kompilatorów języka C obsługuje #warning (ale nie jest zdefiniowany przez standard C).

Jednak GCC przynajmniej nie wykonuje wstępnego przetwarzania następujących danych, co oznacza, że ​​trudno jest zobaczyć wartość zmiennej.

#define PP_VAR 123 
#warning "Value of PP_VAR = " PP_VAR 
#warning "Value of PP_VAR = " #PP_VAR 
#warning "Value of PP_VAR = " ##PP_VAR 

GCC produkuje:

x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR 
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR 
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR 
+7

Kiedy więc mówisz "trudno jest zobaczyć wartość zmiennej", to znaczy, że naprawdę NIE MOŻESZ tego zobaczyć. – Nick

+0

Mniej więcej - tak; Nie wymyśliłem sposobu, żeby to zobaczyć, co nie jest takie samo jak "nie ma sposobu, aby to zobaczyć". –

+0

I *** think *** to jest to, co próbuję zrobić .... Chcę wiedzieć, co biblioteka runtime określa "SSIZE_MAX" jako ciąg znaków (jak '0',' INT_MAX' lub 'LONG_MAX '), ale stringy zwraca tylko' SSIZE_MAX' (lewa strona definicji). – jww

8

Działa z GCC 4.4.3:

#define STRING2(x) #x 
#define STRING(x) STRING2(x) 
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX) 

plony:

src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017 
Powiązane problemy