2016-04-21 56 views
7

我想声明一个静态常量数组,其中包含带有版本信息的字符串。C预处理器:字符串化不起作用

我已经有两个版本号的宏,我想根据它生成一个初始的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交叉编译器。

当我在我的PC上用Cygwin GCC 4.5.3做同样的工作时,

非常感谢您的帮助。

UPDATE:

原来API_VERSION_MAJORAPI_VERSION_MINOR宏是在源文件中unvisible。我只是错过了包括。很简单。太简单了,显而易见。

请注意,在这种情况下没有任何警告输出。

+4

完全无关的问题,但不要使用具有前导下划线和大写字母的符号名称,因为这些名称是为“实现”(即编译器和标准库)保留的。 –

+3

刚刚在Ubuntu 12.04和14.04上尝试了gcc 4.4,4.8和4.9,i386,x64和cross-arm的代码片段 - 按预期工作(使用'compiler -E testfile.c')。我认为问题在别的地方。这是编译器/预处理器中的一个主要缺陷,否则就无法工作。 – Dummy00001

+0

从源文件复制并粘贴发布的代码? – LPs

回答

7

然后,您定制的GCC 4.4.1 ARM交叉编译器是越野车。

如果您自己编译它,有时会禁用某些过度激进的优化选项,这些优化选项可能并不能解决所有问题。

条条框框思考,你可能会调整的源代码,以避免该问题:

#define API_VERSION_MAJOR "4" 
#define API_VERSION_MINOR "47" 
static const char OSAPIVersion[] = API_VERSION_MAJOR "." API_VERSION_MINOR; 

或可能构成串在运行时:

#define API_VERSION_MAJOR 4 
#define API_VERSION_MINOR 47 
static char OSAPIVersion[8]; 
int main(void) { 
    snprintf (OSAPIVersion, sizeof OSAPIVersion, "%d.%d", API_VERSION_MAJOR, API_VERSION_MINOR); 
}