C预处理器:字符串化不起作用

yur*_*rko 7 c c-preprocessor

我想声明一个静态const数组,其中包含带有版本信息的字符串.

我已经有两个带版本号的宏,我想基于它生成一个初始的const字符串.

我正在尝试使用此处描述的方法,但它不能像预期的可用编译器工具那样工作.

我的代码是下一个:

#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) ;
Run Code Online (Sandbox Code Playgroud)

当我打印数组时,其值为"API_VERSION_MAJOR.API_VERSION_MINOR"而不是"4.47".

我使用定制的GCC 4.4.1 ARM交叉编译器.

当我在使用Cygwin GCC 4.5.3的PC上执行相同操作时,它可以正常工作.

预先感谢您的帮助.

更新:

事实证明,API_VERSION_MAJORAPI_VERSION_MINOR宏在源文件中是不可见的.我错过了包括.很简单.显而易见太简单了.

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

Jen*_*ens 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;
Run Code Online (Sandbox Code Playgroud)

或者可能在运行时构造字符串:

#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);
}
Run Code Online (Sandbox Code Playgroud)