我想声明一个静态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_MAJOR和API_VERSION_MINOR宏在源文件中是不可见的.我错过了包括.很简单.显而易见太简单了.
请注意,在这种情况下没有任何警告输出.
然后您的自定义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)