【发布时间】:2016-08-14 09:02:01
【问题描述】:
我想声明一个静态 const 数组,其中包含带有版本信息的字符串。
我已经有两个带有版本号的宏,我想根据它生成一个初始的 const 字符串。
我正在尝试使用here 描述的方法,但它不能像预期的那样使用可用的编译器工具。
接下来是我的代码:
#define API_VERSION_MAJOR 4
#define API_VERSION_MINOR 47
#define _STR(x) #x
#define STR(x) _STR(x)
static const char OSAPIVersion[] =
STR(API_VERSION_MAJOR) "." STR(API_VERSION_MINOR) ;
当我打印数组时,它的值为 "API_VERSION_MAJOR.API_VERSION_MINOR" 而不是 "4.47"。
我使用定制的 GCC 4.4.1 ARM 交叉编译器。
当我在装有 Cygwin GCC 4.5.3 的 PC 上执行相同操作时,它可以工作。
提前感谢您的帮助。
更新:
原来 API_VERSION_MAJOR 和 API_VERSION_MINOR 宏在源文件中是不可见的。我只是错过了包含。很简单。太简单了,不明显。
请注意,在这种情况下没有任何警告输出。
【问题讨论】:
-
与您的问题完全无关,但不要使用带有前导下划线后跟大写字母的符号名称,因为它们是为“实现”(即编译器和标准库)保留的。
-
刚刚在 Ubuntu 12.04 和 14.04 上尝试了 gcc 4.4、4.8 和 4.9、i386、x64 和 cross-arm 的代码片段 - 按预期工作(使用
compiler -E testfile.c)。我认为问题出在其他地方。这将是编译器/预处理器中的一个主要错误,否则无法正常工作。 -
与在线编译器一起工作正常ideone.com/InZcfu
-
您确定
API_VERSION_MAJOR可用于OSAPIVersion的编译单元吗?它在您的示例中,但它是否在您的真实代码中(例如,如果您使用编译器标志来定义预处理器常量)? -
发布的代码不是你的真实代码......
标签: c c-preprocessor