具有 c++ 代码的常量和弱属性

Const and weak attribute with c++ code

本文关键字:属性 常量 c++ 代码 具有      更新时间:2023-10-16

我无法理解下面的编译错误。

第一个文件是一个标头,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 代码时,可以将该属性应用于它。