#define PLAINTEXT_TARGET "plaintext"
if(strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET)
/* ... */
请问C语言保证上述PLAINTEXT_TARGET
编译成一个单一的实例?如果编译器可能产生两个宏字符串的实例,那么上面的条件是误导性的,可能是错误的。宏解析地址
#define PLAINTEXT_TARGET "plaintext"
if(strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET)
/* ... */
请问C语言保证上述PLAINTEXT_TARGET
编译成一个单一的实例?如果编译器可能产生两个宏字符串的实例,那么上面的条件是误导性的,可能是错误的。宏解析地址
宏做简单的文本替换。预处理器用"plaintext"
替换PLAINTEXT_TARGET
的所有匹配项,然后编译器查看结果并编译该结果。
所以编译器看到两个字符串值,它不能保证那些不会被分开存放(见阿洛克的从标准根据报价的答案)。该代码确实是误导性的,将PLAINTEXT_TARGET
声明为常数会更合理:
const char* const PLAINTEXT_TARGET = "plaintext";
不,这不是标准保证。标准说,这大约“字符串文字”(6.4.5p6):
它是未指定的这些阵列是否是不同的条件是它们的元件具有 适当的值。
这些阵列指char
从文字串在翻译阶段创建7.
由于正在使用的宏阵列,由编译器看到的代码是:
if(strstr("plaintext", optarg) == "plaintext")
当optarg
为"plaintext"
时,代码缩小为
if("plaintext" == "plaintext")
正如上面提到的,这不能保证在C是真的
所以,你必须使用strcmp()
不是检查平等的指针,或者,在对方的回答,定义一个指针char *
改为使用的宏观。
啊!你的回答相互引用!我无法停止在他们之间来回走动! – 2010-01-04 08:28:42
如果现在唯一的问题是将有大约递归...... – sth 2010-01-04 08:31:52
LOL!相互递归的一个很好的例子,我希望。 – 2010-01-04 08:39:41