#define PLAINTEXT_TARGET "plaintext"
if( strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET )
/* ... */
C语言是否保证上面PLAINTEXT_TARGET
编译成单个实例?如果编译器可能产生宏字符串的两个实例,那么上面的条件是误导性的,可能是假的。
答案 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 *
指针来代替宏而使用。