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