#define多行上的字符串

时间:2017-02-14 17:21:23

标签: c string c-preprocessor string-literals preprocessor-directive

我想知道如何在多行上定义一个非常长的字符串。 我尝试了很多不同的模式,但它们都没有工作.. 这是我的代码。

#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
                "ccccccccccccccccccccccccccccccccccc"
                "ddddddddddddddddddddddddddddddddddd"

我得到语法错误。 我得到的错误是

ccompile.h (as included in test.c)
=================
error: syntax error before or at: g
*** Error code 2

我要分配" aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccccccccdddddddd"示例。

我尝试使用\和@ \但是没有成功。

2 个答案:

答案 0 :(得分:7)

摆脱线条之间的空白,引用整个事物。 EOL中的\基本上“转义”换行符,因此它不会成为字符串本身的一部分。它仅与预处理器相关:

#include <stdio.h>

#define LONG_STRING "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"

int main ( void ) {
    printf(LONG_STRING);
    return 0;
}

有效just fine

出于审美原因,您可以单独引用每一行,唯一的要求是在结束引号后直接添加\

#define LONG_STRING "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\
                    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\
                    "ccccccccccccccccccccccccccccccccccccccccccccc"

这也适用于just fine

注意:

两个建议不是 100%等效。第一个版本将宏定义为单个字符串文字。第二个版本将宏定义为3 单独的字符串文字。在大多数情况下,这不是什么大问题,因为在翻译阶段,应该连接相邻的字符串文字标记:

  

5.1.1.2翻译阶段:
  [...]
  6.连接相邻的字符串文字标记   7.分隔标记的空白字符不再重要。每   预处理令牌转换为令牌。由此产生的代币是   语法和语义分析和翻译为翻译单位。

我找不到Meninx提到的关于C99表现不同的脚注。文档我使用了can be found here

答案 1 :(得分:3)

#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
                "ccccccccccccccccccccccccccccccccccc"
                "ddddddddddddddddddddddddddddddddddd"

对于上述指令,其替换列表仅限于"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",因为宏定义仅适用于单个逻辑行

此外,在预处理期间,在C中无法连接相邻的字符串文字以形成单个文字。

C99 脚注148

  

148:请注意,相邻的字符串文字不会连接成a   单字符串文字

而是使用反斜杠换行符:

#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccc\
ddddddddddddddddddddddddddddddddddd"

C99 5.1.1.2 p / 2

  
      
  1. 删除紧跟一个新行字符的反斜杠字符()的每个实例,将物理源行拼接到   形成逻辑源行。任何物理上只有最后一个反斜杠   源线应有资格成为此类拼接的一部分。一个   非空的源文件应以换行符结尾   在任何之前不得立即使用反斜杠字符   发生了这样的拼接。
  2.