同一字符串的多个#定义是否使用相同的常量字符串
Does multiple #define of the same string use the same constant string?
同一字符串的多个#定义是否使用相同的常量字符串?假设我在多个地方执行以下操作:
#define TEST @"test"
编译器足够聪明,知道它引用了数据段中的同一个常量字符串,对吧?
确实,您的问题与#define的作用无关,而是与编译器如何处理字符串文字有关。编译器将字符串对象插入到程序映像中,该映像是只读的,不实现保留计数。这是一个优化,因此不需要在运行时创建字符串。
通常,编译器足够聪明,可以识别出您使用的是相同的字符串文字,并且会使用相同的常量字符串,但它不会在堆中。
还要检查这个问题:ObjectiveC字符串文字的权威描述?
编译器执行一种称为字符串内部处理的操作。这不是一个必要的操作,所以如果您的代码依赖于test
位于同一地址,那么您可能会遇到一些问题。在大多数情况下,是的,它将尝试重用相同的字符串,并使它们都指向同一个字符串(在只读内存中)。
相关文章:
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- 3 与错误最接近的总和:字符串常量之前的预期非限定 id
- 为什么字符串(常量字符* s,size_t pos,size_t len = npos)有效?
- 指向字符串常量的指针
- 警告:ISO C++禁止将字符串常量转换为'char*' [-Wwrite-strings]
- 为什么在波纹管程序中发生了从字符串常量到'char*'的警告已弃用的转换
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 如何从字符串常量创建字符数组
- 将字符串常量转换为char
- C++ 字符串常量和静态初始化顺序惨败
- 使用 std::string 返回开关大小写块中的字符串常量
- 消除从字符串常量到'char*'的已弃用转换的最佳方法"
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 字符常量或字符串常量
- Swig:如何类型映射c ++字符串常量和python字符串?
- 字符串常量之前的预期构造函数、析构函数或类型转换
- 为什么从字符串常量到"char*"的转换在 C 中有效,但在C++中无效
- 警告:已弃用从字符串常量到 'char* 的转换
- 无法获得通过C++警告:(和崩溃后)已弃用从字符串常量到"char*"的转换 [-Wwrite-strings]
- 错误:字符串常量 extern "a" { 之前应为非限定 ID