2

我在 The C++ Programming Language special 3rd edition 中阅读了以下内容:

是否将两个相同的字符文字分配为一个是实现定义的(§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 和 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 上)

!fine(在 MSVS 2010 上)

为什么将其保留为实现定义的行为?是什么原因?

4

1 回答 1

2

我们可以在这个comp.std.c 线程中找到一个基本原理:历史问题:字符串文字,它说:

GCC 可能是一个例子,但不是动力。部分原因是希望在 ROMmable 数据中包含字符串文字是为了支持,呃,ROMming。我隐约记得曾经使用过几个 C 实现(在做出 X3J11 决定之前),其中字符串文字要么自动汇集,要么存储在常量数据程序部分中。 当需要原始 UNIX 属性时,考虑到现有的各种实践和一种简单的变通方法,最好不要尝试保证字符串文字的唯一性和可写性。

于 2015-06-15T17:40:06.770 回答