【问题标题】:C preprocessor: stringification does not workC 预处理器:字符串化不起作用
【发布时间】: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_MAJORAPI_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


【解决方案1】:

那么你定制的 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2011-10-22
    • 2013-09-25
    • 1970-01-01
    • 2019-06-21
    • 2015-04-18
    相关资源
    最近更新 更多