【问题标题】:Placing define macro between two string literals在两个字符串文字之间放置定义宏
【发布时间】:2017-10-16 20:54:07
【问题描述】:

我知道可以将定义的宏与这样的字符串文字连接起来

#define R "car"
const char * s1 = "foo"R; //s1="foocar"

但是当我尝试将R 放在这样的两个字符串文字之间时

#define R "car"
const char * s1 = "foo"R"bar"; //compile-time error

我收到编译时错误error: stray 'R' in program。上面的第二个例子如何才能实现s1 = "foocarbar"

【问题讨论】:

  • 它似乎工作:ideone.com/7KMByV 你能添加一些关于编译器和操作系统的信息来重现错误吗?
  • 您是否也收到“错误:原始字符串分隔符中的换行符无效”?

标签: c macros string-literals


【解决方案1】:

C++ 有一个称为“原始字符串文字”的特性,由字母 R 引入。

gcc 显然支持 C 中的 C++ 风格的原始字符串文字作为扩展。如果您为宏使用了 R 以外的名称,则不会遇到此问题。

字符串文字连接不需要字符串文字相邻。而不是这个:

#define R "car"
const char * s1 = "foo"R"bar"; 

你可以写:

#define R "car"
const char * s1 = "foo" R "bar";

但是您的原始代码是有效的 C,如果您使用诸如 -std=c11 之类的选项使 gcc 更接近一致,gcc 应该接受它。

请注意,如果您的宏使用 R 以外的名称,则不会有问题。

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 2023-03-27
    • 2013-03-27
    • 2011-06-22
    • 1970-01-01
    • 2018-05-07
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多