【问题标题】:C string appendC字符串追加
【发布时间】:2011-08-24 02:08:08
【问题描述】:

我有两个要附加的 C 字符串,结果应该分配给一个 lhs 变量。我看到了一个静态初始化代码,如:

char* out = "May God" "Bless You";

打印出来的输出真的是"May GodBless You"。我知道这个结果可能是一些未定义行为的输出。

代码实际上是在生产中,从未给出错误的结果。这不像我们只在一个地方有这样的声明。它可以在多个地方看到非常稳定的代码,并用于形成 sql 查询。

C 标准是否允许这种连接?

【问题讨论】:

    标签: c string standards append


    【解决方案1】:

    The Standard

    5.1.1.2 翻译阶段

    6。相邻的字符串文字标记被连接起来。

    所以,Solaris 编译器做了正确的事情。

    【讨论】:

      【解决方案2】:

      是的,这是有保证的。

      http://en.wikipedia.org/wiki/C_syntax#String_literal_concatenation 中提取:

      相邻的字符串字面量是 在编译时连接;这 允许将长字符串拆分 多行,也允许字符串 由 C 预处理器产生的文字 要附加到的定义和宏 编译时的字符串

      【讨论】:

      • 不,仅适用于字符串文字。
      • @Mayank:不,它只用于编译时的静态初始化。
      • 但是#define a "May God", #define b "Bless You", const char *c = a " " b; 没问题。
      • @Mayank:还要注意ab 不是字符串;它们是指针(pmg 的例子除外:)
      • @Mayank 不,这是一个可分配给const char*的字符串文字
      【解决方案3】:

      是的。这种连接在 C 中是允许的,它不是未定义的行为。

      虽然我认为它应该产生“愿上帝保佑你”(因为引用部分没有空格)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-20
        • 2011-12-24
        • 2016-07-31
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多