代码之家  ›  专栏  ›  技术社区  ›  Eli Bendersky

C语言与C++中字符串文字串连接的实现

  •  7
  • Eli Bendersky  · 技术社区  · 16 年前

    好吧,这个问题同样适用于

    第6步“翻译阶段”中指定的 C 标准(C99标准草案中的5.1.1.2)规定相邻的字符串文字必须连接成单个文字。 I.e.

    printf("helloworld.c" ": %d: Hello "
           "world\n", 10);
    

    在语法上等同于:

    printf("helloworld.c: %d: Hello world\n", 10);
    

    cpp )或者编译器本身。一些在线研究告诉我,这个函数通常是由预处理器执行的( source #1 , source #2

    但是,运行 cpp公司 在Linux中显示 cpp公司 不能做到:

    eliben@eliben-desktop:~/test$ cat cpptest.c 
    int a = 5;
    
    "string 1" "string 2"
    "string 3"
    
    eliben@eliben-desktop:~/test$ cpp cpptest.c 
    # 1 "cpptest.c"
    # 1 "<built-in>"
    # 1 "<command-line>"
    # 1 "cpptest.c"
    int a = 5;
    
    "string 1" "string 2"
    "string 3"
    

    所以,我的问题是:在预处理器或编译器本身中,应该在哪里处理语言的这个特性?

    也许没有一个好的答案。基于经验、已知编译器和一般良好工程实践的启发式答案将受到赞赏。


    Python based C parser 应该处理字符串-文字连接(目前还没有),或者让它自己处理 cpp公司 它假设在它之前运行。

    5 回复  |  直到 10 年前
        1
  •  9
  •   Jerry Coffin    16 年前

    该标准没有指定预处理器和编译器,它只是指定了您已经注意到的翻译阶段。传统上,第一阶段到第四阶段在预处理器中,第五阶段到第七阶段在编译器中,第八阶段在链接器中——但是这些都不是标准所要求的。

        2
  •  4
  •   Cogwheel    16 年前

    除非指定预处理器来处理这个问题,否则可以安全地假设这是编译器的工作。

    “你的” I.e.

    相邻的字符串文字在编译时连接起来;这允许将长字符串拆分为多行,还允许字符串文字 附加到字符串 在编译时 ...

        3
  •  2
  •   Heath Hunnicutt    16 年前

    在ANSI C标准中,该细节在第5.1.1.2节第(6)项中进行了说明:


    ...





    步骤4显然是预处理器的职责。

    步骤5要求“执行字符集”是已知的。编译器也需要这些信息。如果预处理器不包含平台依赖项,那么将编译器移植到新平台就更容易了,因此倾向于在编译器中实现步骤5,从而实现步骤6。

        4
  •  1
  •   ShinTakezou    16 年前

    我会在解析器的扫描标记部分处理它,所以在编译器中。这似乎更符合逻辑。预处理器不必知道语言的“结构”,事实上它通常会忽略它,这样宏就可以生成不可编译的代码。它只处理它有权处理的特定于它的指令( # ... ),以及它们的“后果”(如 #define x h

        5
  •  1
  •   zwol    16 年前

    字符串-文字串联如何与转义序列交互有一些棘手的规则。

    const char x1[] = "a\15" "4";
    const char y1[] = "a\154";
    const char x2[] = "a\r4";
    const char y2[] = "al";
    

    然后 x1 和 x2 strcmp ,和 y1 y2 . (这就是希思引用翻译步骤的意思——转义转换发生了 之前 字符串常量连接。)还有一个要求,如果 任何 L 或 U 前缀,则得到宽字符串或Unicode字符串。把它们放在一起,作为“编译器”而不是“预处理器”的一部分来完成这项工作会更加方便