宏分辨率地址

时间:2010-01-04 08:02:53

标签: c

#define PLAINTEXT_TARGET "plaintext"
if( strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET )
    /* ... */

C语言是否保证上面PLAINTEXT_TARGET编译成单个实例?如果编译器可能产生宏字符串的两个实例,那么上面的条件是误导性的,可能是假的。

2 个答案:

答案 0 :(得分:6)

宏做简单的文本替换。预处理器用PLAINTEXT_TARGET替换每次"plaintext",然后编译器查看结果并编译它。

因此,编译器会看到两个字符串文字,并且不能保证它们不会单独存储(请参阅Alok对标准相应引用的答案)。代码确实具有误导性,将PLAINTEXT_TARGET声明为常量更合理:

const char* const PLAINTEXT_TARGET = "plaintext";

答案 1 :(得分:5)

不,标准不保证。标准说这是关于“字符串文字”(6.4.5p6):

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观。

这些数组是指在翻译阶段7从文字字符串创建的char数组。

由于您使用的是宏,编译器看到的代码是:

if( strstr("plaintext", optarg) == "plaintext" )

optarg"plaintext"时,代码会缩减为

if("plaintext" == "plaintext")

如上所述,在C中不能保证这一点。

因此,您必须使用strcmp()而不是检查指针是否相等,或者,如在另一个答案中那样,定义一个char *指针来代替宏而使用。