如何在编译时显示#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)
是主要版本。