能否将常量字符串指针用作ID?如何确保同值常量字符串指针一致?
常量字符串指针用作ID的可行性分析
能不能用常量字符串指针当ID?
语法上是可行的——就像你给出的代码示例那样,把字符串常量的指针隐式转换为void*返回,再直接通过指针相等判断来做标识匹配。但这种做法的可靠性完全依赖编译器实现,不属于C/C++标准强制要求的行为。
相同值的字符串常量是否会共用同一个指针?
C和C++标准都没有规定编译器必须合并相同内容的字符串常量。不过主流编译器(GCC、Clang、MSVC等)在默认或开启特定优化(比如GCC的-fmerge-constants选项)时,会将只读段中内容完全一致的字符串常量合并到同一块内存,这时指针比较会成立。
但存在不少例外情况会导致指针不相等:
- 相同字符串常量位于不同编译单元时,部分编译器不会跨单元合并,指针比较会失败。
- 调试模式下,部分编译器会关闭字符串合并优化,方便定位内存相关问题,此时相同字符串的指针也会不同。
- 运行时动态生成的字符串(比如用
malloc分配后拷贝内容),哪怕值和常量字符串一致,指针也必然不同。
针对你给出的代码场景
void *gettok() { ... return "if"; } ... tok = gettok(); ... if (tok == "if") {...}
这段代码在开启字符串合并的编译环境下能正常工作,但一旦编译器未做合并,gettok返回的"if"指针和判断语句里的"if"指针会指向不同内存块,导致判断逻辑出错。
总结建议
- 如果你只针对特定编译器和固定编译选项开发,且能确保所有目标字符串常量都会被合并,这种写法可以用,但可移植性极差,换个编译环境就可能出问题。
- 工程上更稳妥的方案:
- 用枚举类型作为ID,类型安全且行为完全可靠。
- 若必须用字符串标识,改用
strcmp比较内容,这是标准保证的行为,不受编译器优化影响。
内容的提问来源于stack exchange,提问作者Konrad Eisele
相关产品推荐
相关产品推荐

