2010-01-04 135 views
1
#define PLAINTEXT_TARGET "plaintext" 
if(strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET) 
    /* ... */ 

请问C语言保证上述PLAINTEXT_TARGET编译成一个单一的实例?如果编译器可能产生两个宏字符串的实例,那么上面的条件是误导性的,可能是错误的。宏解析地址

回答

6

宏做简单的文本替换。预处理器用"plaintext"替换PLAINTEXT_TARGET的所有匹配项,然后编译器查看结果并编译该结果。

所以编译器看到两个字符串值,它不能保证那些不会被分开存放(见阿洛克的从标准根据报价的答案)。该代码确实是误导性的,将PLAINTEXT_TARGET声明为常数会更合理:

const char* const PLAINTEXT_TARGET = "plaintext"; 
+0

啊!你的回答相互引用!我无法停止在他们之间来回走动! – 2010-01-04 08:28:42

+0

如果现在唯一的问题是将有大约递归...... – sth 2010-01-04 08:31:52

+0

LOL!相互递归的一个很好的例子,我希望。 – 2010-01-04 08:39:41

5

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

它是未指定的这些阵列是否是不同的条件是它们的元件具有 适当的值。

这些阵列char从文字串在翻译阶段创建7.

由于正在使用的宏阵列,由编译器看到的代码是:

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

optarg"plaintext"时,代码缩小为

if("plaintext" == "plaintext") 

正如上面提到的,这不能保证在C是真的

所以,你必须使用strcmp()不是检查平等的指针,或者,在对方的回答,定义一个指针char *改为使用的宏观。