C 宏解析地址

C 宏解析地址,c,C,C语言是否保证上述明文_目标编译成单个实例?如果编译器可能生成宏字符串的两个实例,则上述条件具有误导性,可能为假。否,该标准不保证。标准对字符串文字6.4.5p6作了如下说明: 如果这些数组的元素具有 适当的值 这些数组是指在翻译阶段7中从文字字符串创建的字符数组 由于您使用的是宏,编译器看到的代码是: #define PLAINTEXT_TARGET "plaintext" if( strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET )

C语言是否保证上述明文_目标编译成单个实例?如果编译器可能生成宏字符串的两个实例,则上述条件具有误导性,可能为假。

否,该标准不保证。标准对字符串文字6.4.5p6作了如下说明:

如果这些数组的元素具有 适当的值

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

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

#define PLAINTEXT_TARGET "plaintext"
if( strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET )
    /* ... */
当optarg为纯文本时,代码减少为

if( strstr("plaintext", optarg) == "plaintext" )
如上所述,这不能保证在C中是正确的


因此,您必须使用strcmp而不是检查指针是否相等,或者像在另一个答案中一样,定义要使用的char*指针而不是宏。

否,该标准不保证这一点。标准对字符串文字6.4.5p6作了如下说明:

如果这些数组的元素具有 适当的值

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

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

#define PLAINTEXT_TARGET "plaintext"
if( strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET )
    /* ... */
当optarg为纯文本时,代码减少为

if( strstr("plaintext", optarg) == "plaintext" )
如上所述,这不能保证在C中是正确的


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

宏执行简单的文本替换。预处理器将每次出现的明文_目标替换为明文,然后编译器查看结果并编译该结果

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

if("plaintext" == "plaintext")

宏执行简单的文本替换。预处理器将每次出现的明文_目标替换为明文,然后编译器查看结果并编译该结果

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

if("plaintext" == "plaintext")

啊!你的答案互相参考!我不能停止他们之间的往来!啊!你的答案互相参考!我不能停止他们之间的往来!