如何显示的#define在编译时的价值?(How do I show the value of a

2019-07-23 06:52发布

我试图找出提高我的代码,认为它使用的是哪个版本。 我想要做这样的事情:

#error BOOST_VERSION

但预处理器不扩大BOOST_VERSION。

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

Answer 1:

如果您正在使用Visual C ++,你可以使用#pragma message

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

编辑:感谢LB链路

显然,GCC当量(未测试):

#pragma message "BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION)


Answer 2:

BOOST_PP_STRINGIZE似乎是C ++一个优秀的解决方案,而不是常规的C.

这里是我的GNU CPP的解决方案:

/* 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"

对于“定义为整数”,“ 定义为串”“定义,但没有价值”的变量,他们的工作就好了。 只为“没有定义”变量,它们显示完全一样的原始变量名。 你必须习惯它 - 或者也许有人可以提供更好的解决方案。



Answer 3:

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

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

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

然后可以显示与宏的值:

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

请参阅:3.4字串gcc的在线文档。



Answer 4:

据我所知“#ERROR”将只打印字符串,其实你甚至不需要使用引号 。

你是否尝试过使用“BOOST_VERSION”写入不同的目的地不正确的代码? 也许类似 “嗒嗒[BOOST_VERSION] = FOO;” 会告诉你,像“字符串文字1.2.1不能用作阵列地址”。 这不会是一个非常错误的消息,但至少它会告诉你相关的值。 直到你找到一个编译错误,它告诉你的价值,你可以玩。



Answer 5:

如果没有提升:

  1. 再次定义相同的宏和编译器将亲自给予警告。

  2. 从警告你可以看到以前的定义的位置。

  3. 先前定义的VI文件。

ambarish@axiom:~/cpp$ g++ shiftOper.cpp
shiftOper.cpp:7:1: warning: "LINUX_VERSION_CODE" redefined
shiftOper.cpp:6:1: warning: this is the location of the previous definition

#define LINUX_VERSION_CODE 265216
#define LINUX_VERSION_CODE 666

int main ()
{

}


Answer 6:

#define a <::BOOST_VERSION>
#include a
MSVC2015:致命错误C1083:无法打开包含文件:“:: 106200”:没有这样的文件或目录

作品即使preprocess to file被启用,即使无效令牌存在:

#define a <::'*/`#>
#include a
MSVC2015:致命错误C1083:无法打开包含文件:“::” * /`#':没有这样的文件或目录
GCC4.x:警告:缺少终端'字符[-Winvalid-PP-令牌]
#定义一个<::'* /`#>


Answer 7:

你也可以预处理源文件,看看预处理值的计算结果为。



Answer 8:

在Microsoft C / C ++,你可以使用内置的_CRT_STRINGIZE()打印常数。 我的很多stdafx.h文件包含的一些组合:

#pragma message("_MSC_VER      is " _CRT_STRINGIZE(_MSC_VER))
#pragma message("_MFC_VER      is " _CRT_STRINGIZE(_MFC_VER))
#pragma message("_ATL_VER      is " _CRT_STRINGIZE(_ATL_VER))
#pragma message("WINVER        is " _CRT_STRINGIZE(WINVER))
#pragma message("_WIN32_WINNT  is " _CRT_STRINGIZE(_WIN32_WINNT))
#pragma message("_WIN32_IE     is " _CRT_STRINGIZE(_WIN32_IE))
#pragma message("NTDDI_VERSION is " _CRT_STRINGIZE(NTDDI_VERSION)) 

输出是这样的:

_MSC_VER      is 1915
_MFC_VER      is 0x0E00
_ATL_VER      is 0x0E00
WINVER        is 0x0600
_WIN32_WINNT  is 0x0600
_WIN32_IE     is 0x0700
NTDDI_VERSION is 0x06000000


Answer 9:

您是否正在寻找

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

没有伟大的,如果BOOST_VERSION是一个字符串,就像我假设,但也可能是主要的,次要和修订号定义单独整数。



Answer 10:

纵观预处理器的输出是最接近你要的答案。

我知道你已经排除了(和其他方式),但我不知道为什么。 你有足够具体的问题要解决,但没有解释原因的任何“正常”的方法不适合你很好地工作。



Answer 11:

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



Answer 12:

BOOST_VERSION在升压头文件version.hpp定义。



Answer 13:

看看Boost文档以及,关于你如何使用宏:

参照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)是主版本。



文章来源: How do I show the value of a #define at compile-time?