具有 c++ 代码的常量和弱属性
Const and weak attribute with c++ code
我无法理解下面的编译错误。
第一个文件是一个标头,test_weak.h
:
#ifndef TEST_WEAK_H
#define TEST_WEAK_H
#ifndef __ASSEMBLER__
const char* const TUTU __attribute__((weak)) ="TUTU";
const char* TUTU_DATE __attribute__((weak)) = __DATE__;
const char* const tutu ="tutu";
#endif /*ASSEMBLER*/
#endif /*TEST_WEAK_H*/
第二个文件是主test.cpp
:
int main ()
{
return 42;
}
要编译我运行:g++ -include test_weak.h test.cpp -o test
编译结果为:
In file included from <command-line>:0:0:
./test_weak.h:5:44: error: weak declaration of ‘TUTU’ must be public
通过在测试源文件上用 c 扩展名替换 cpp 扩展并使用 gcc 而不是 g++,我能够成功运行这段代码。我还可以通过删除弱属性或删除第二个常量来修复此错误。所以是的,我能够修复编译错误,但无法理解这里问题的原因。
例如,这一行编译没有问题:
const char* TUTU __attribute__((weak)) ="TUTU";
为什么我不能在 c++ 中使用 const char* const
+ 弱属性?
weak
属性告诉链接器如何处理多个不同翻译单元中同一实体的定义。C++,要使其相关,实体必须具有外部链接 - 这就是链接器所说的"公共"的含义。 In C++,一个变量,它本身const
具有内部链接违约。 您可能想要的是:
extern char const* const TUTU __attribute__((weak)) = "TUTU";
从形式上讲,这将是C++中未定义的行为(没有 __attribute__
,这不是C++)。 弱者的目的属性是允许它,所有实例共享相同的内存(它会导致未定义的行为,或者至少未指定,如果任何实例具有不同的初始 化。
实际上:您可能想要的是:
extern char const TUTU[] __attribute__((weak)) = "TUTU";
白白引入指针毫无意义。
编辑:
请注意,这是 C 和 C++ 之间的区别之一。 在C、const
联动没有影响。
在C++中,声明为const
且未显式声明extern
变量接收内部链接(即,好像它被声明为static
)。显然,这不能与weak
属性结合使用。
没有此规则,因此符号获得外部链接,因此当您将其编译为 C 代码时,可以将该属性应用于它。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 具有常量属性的不可变类
- C++ 中常量属性的初始化构造函数错误
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准
- 作为类的静态属性的常量内存符号
- 属性树常量迭代器的索引
- 如何获取静态常量属性的地址?
- 具有 c++ 代码的常量和弱属性
- 返回具有常量字符* 属性的结构
- 如何使具有常量属性的类可分配
- 修改常量函数中的非常数属性
- 如何在SQL中存储具有大量(常量)属性的数据