2012-03-14 25 views
22

yılında derleme zamanında bir #define değerini gösteriyor Şimdiye kadar kadarıyla var: çalışır, ancak ADEFINE bir dize nedir değilsenasıl gcc

#define ADEFINE "23" 
#pragma message ("ADEFINE" ADEFINE) 

?

#define ADEFINE 23 
#pragma message ("ADEFINE" ADEFINE) 

nedenler:

uyarı: hatalı oluşturulmuş ‘#pragma mesajı’

ihmal İdeal tanımlanmamış dahil herhangi bir değere, başa edebilmek istiyorum.

cevap

22

dize olmayan makro görüntülemek için stringify the macro:

#define STRINGIFY(s) XSTRINGIFY(s) 
#define XSTRINGIFY(s) #s 

#define ADEFINE 23 
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE)) 

boost varsa/istediğinizde, sizin için boost stringize kullanabilirsiniz:

#include <boost/preprocessor/stringize.hpp> 
#define ADEFINE 23 
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE)) 
+0

Evet, müvekkilimin bağımlılık olarak eklenmiş olmaktan çok mutlu olacağını sanmıyorum, ama bu bir varoluş kanıtı gibi görünüyor. Belki de gitmeliyim ve stringize.hpp 'ye bir göz atmalıyım –

+4

@JohnLawrenceAspden Cevabı, destek olmadan (ya da herhangi bir başka kütüphane) nasıl yapacağımı güncelledim. – rob05c

6

İstediğinizi yapıp yapamayacağından emin değilim, ancak yalnızca ilgili makro sorununu ayıklamakla ilgileniyorsanız (bu nedenle her derleme için bir iletide görüntülenmesi gereken bir şey değil) senin için çalışabilir. Ön işleme çıkışı ile birlikte #define yönergelerini dökmek için gcc'nin -E -dD seçeneğini kullanın. grep içinden sadece çizgiler görmek Sonra boru istediğiniz:

// test.c 
#include <stdlib.h> 
#include <stdio.h> 
#define ADEFINE "23" 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
#undef ADEFINE 
#define ADEFINE 42 
    return 0; 
} 

komut gcc -E -dD -c test.c | grep ADEFINE gösterir:

#define ADEFINE "23" 
#undef ADEFINE 
#define ADEFINE 42