我试图找出我的代码认为它使用的 Boost 版本。我想做这样的事情:

#error BOOST_VERSION

但预处理器不会扩展 BOOST_VERSION。

我知道我可以在程序运行时将其打印出来,并且我知道我可以查看预处理器的输出来找到答案。我觉得在编译过程中找到一种方法可能会很有用。

有帮助吗?

解决方案

如果使用的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)

其他提示

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"

有关的 “定义为整数”下,的 “定义为字符串”下,和 “限定的但没有值”变量,它们工作得很好。仅用于<强>“未定义” 变量,它们显示完全一样原始变量名。你必须习惯它 - 或者也许有人可以提供更好的解决方案。

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

这可以在GCC使用字符串化操作符“#”来进行,但它需要两个阶段。

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

然后可以被显示在宏的值:

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

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

它是如何工作的:

在预处理器理解引用的字符串,并从普通文本不同的方式处理它们。字符串连接是这一特殊待遇的例子。消息编译需要一个参数是一个带引号的字符串。当有多个组件的参数,那么它们都必须是字符串,使字符串连接可以应用。预处理器不能假设,就好像它是援引一位未加引号应及时治疗。如果那样,则:

#define ABC 123
int n = ABC;

不会编译。

现在考虑:

#define ABC abc
#pragma message "The value of ABC is: " ABC

这相当于

#pragma message "The value of ABC is: " abc

这导致预处理器警告,因为ABC(无引号)不能与前面的字符串被级联。

现在考虑预处理stringize(这是一度被称为字串,文档中的链接已被更改,以反映修订后的术语。(这两个词,顺便说一句,同样可恨。正确的说法是,当然,stringifaction。要随时更新您的链接。))运算符。这仅作用于宏的参数和替换双引号括起来的论点未展开争论。因此:

#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);

将分配给S1和S2相同的值。如果你运行gcc -E可以在输出看到这一点。也许STR将得到更好的名字类似ENQUOTE。

这解决了周围放置不带引号的项目报价的问题,现在的问题是,如果该参数是一个宏,宏将不会扩大。这就是为什么需要第二个宏。 XSTR扩大它的参数,然后调用STR把扩展后的值成引号。

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

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

没有升压:

  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 ()
{

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

作品即使启用preprocess to file,即使无效标记都存在:

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

在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

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

您是否在寻找

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

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

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

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

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

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

另请查看 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版本号,以便: (BOOST_VERSION % 100) 是次级版本, ((BOOST_VERSION / 100) % 1000) 是次要版本,并且 (BOOST_VERSION / 100000) 是主要版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top