为什么字符串文字比较是C ++中实现定义的行为?

时间:2015-06-15 17:34:44

标签: c++ visual-studio-2010 g++ string-literals g++4.8

我已阅读以下C ++编程语言特别第3版:

是否将两个相同的字符文字分配为一个是实现定义的(§C.1)。

const char* p="Heraclitus";
const char* q="Heraclitus";

void g ()
{
       if (p == q ) cout << "one!\n"; // result is implementation defined
       // ...
}

请注意,==在应用于指针时比较地址(指针值),而不是指向的值。

我在gcc 4.8.1&amp;上尝试过以下程序MSVS 2010

#include <iostream>
int main()
{
    const char* p="Heraclitus";
    const char* q="Heraclitus";
    if(p==q)
        std::cout<<"fine!!!";
    else
        std::cout<<"!fine";
}

输出:

细!!! (在gcc 4.8.1上)

!很好(在MSVS 2010上)

为什么将此作为实现定义的行为?是什么原因?

1 个答案:

答案 0 :(得分:2)

我们可以在comp.std.c thread: History question: String literals中找到理由,并说:

  海湾合作委员会可能是一个例子,但不是动机。   部分希望在ROMmable数据中包含字符串文字   是支持,呃,ROMming。我含糊地回忆起曾经使用过   几个C实现(在X3J11决定之前)   使字符串文字自动合并   或存储在常数数据程序部分。 鉴于此   现有的各种实践和易用性的可用性   在需要原始UNIX属性时解决此问题,   最好不要试图保证唯一性和   字符串文字的可写性。