如何在编译时显示#define的值?

我想弄清楚我的代码认为它使用的是什么版本的Boost。 我想要做这样的事情:

#error BOOST_VERSION

但预处理器不会展开BOOST_VERSION。

我知道我可以从程序运行时打印出来,我知道我可以查看预处理器的输出以find答案。 我觉得在编译过程中有一个这样做的方法可能是有用的。

如果您使用的是Visual C ++,则可以使用#pragma message

 #include <boost/preprocessor/stringize.hpp> #pragma message("BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION)) 

编辑:感谢LB的链接

显然,GCC相当于(未testing):

 #pragma message "BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION) 

对于C ++, BOOST_PP_STRINGIZE似乎是一个很好的解决scheme,但对于常规的C

这是我的GNU CPP解决scheme:

 /* Some test definition here */ #define DEFINED_BUT_NO_VALUE #define DEFINED_INT 3 #define DEFINED_STR "ABC" /* definition to expand macro then apply to pragma message */ #define VALUE_TO_STRING(x) #x #define VALUE(x) VALUE_TO_STRING(x) #define VAR_NAME_VALUE(var) #var "=" VALUE(var) /* Some example here */ #pragma message(VAR_NAME_VALUE(NOT_DEFINED)) #pragma message(VAR_NAME_VALUE(DEFINED_BUT_NO_VALUE)) #pragma message(VAR_NAME_VALUE(DEFINED_INT)) #pragma message(VAR_NAME_VALUE(DEFINED_STR)) 

以上定义导致:

 test.c:10:9: note: #pragma message: NOT_DEFINED=NOT_DEFINED test.c:11:9: note: #pragma message: DEFINED_BUT_NO_VALUE= test.c:12:9: note: #pragma message: DEFINED_INT=3 test.c:13:9: note: #pragma message: DEFINED_STR="ABC" 

对于“定义为整数”“定义为string”“定义但没有值”的variables,它们工作得很好。 只对“未定义”variables,它们显示与原始variables名完全相同。 你必须习惯它 – 也许有人可以提供更好的解决scheme。

我知道这是原来的查询很长一段时间,但这可能仍然有用。

这可以在GCC中使用stringify运算符“#”来完成,但它需要两个阶段。

 #define XSTR(x) STR(x) #define STR(x) #x 

macros的值然后可以显示:

 #pragma message "The value of ABC: " XSTR(ABC) 

请参阅:3.4 gcc在线文档中的string化。

据我所知'#error'只会打印string,实际上你甚至不需要使用引号 。

你有没有尝试使用“BOOST_VERSION”写入各种有目的不正确的代码? 也许像“blah [BOOST_VERSION] = foo;” 会告诉你像“string文字1.2.1不能用作数组地址”。 这不会是一个很好的错误信息,但至less它会告诉你相关的价值。 你可以玩,直到你发现一个编译错误,告诉你的价值。

您也可以预处理源文件并查看预处理器值的计算结果。

查看预处理器的输出是最接近你要求的答案。

我知道你已经排除(和其他方式),但我不知道为什么。 你有一个特定的问题需要解决,但是你没有解释为什么任何“正常”的方法都不适合你。

你可以编写一个打印出BOOST_VERSION的程序,编译并运行它作为你的编译系统的一部分。 否则,我觉得你运气不好。

你在找什么

 #if BOOST_VERSION != "1.2" #error "Bad version" #endif 

如果BOOST_VERSION是一个string,就好像我所假设的那样,但不是很好,但是也可以为主要版本,次要版本和修订版本号定义单独的整数。

BOOST_VERSION在boost头文件version.hpp中定义。

看一下Boost文档,关于如何使用macros:

参考BOOST_VERSION ,从http://www.boost.org/doc/libs/1_37_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.boost_helper_macros

描述XXYYZZ格式的升级版本号,例如: (BOOST_VERSION % 100)是次要版本, ((BOOST_VERSION / 100) % 1000)是次要版本, (BOOST_VERSION / 100000)是主要版本。

Interesting Posts