【问题标题】:Const and weak attribute with c++ codec++ 代码中的常量和弱属性
【发布时间】:2015-01-14 10:43:06
【问题描述】:

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

第一个文件是标题,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 + 弱属性?

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    weak 属性告诉链接器如何处理多个 同一实体在不同翻译单元中的定义。 在 C++ 中,为了使其相关,实体必须具有外部 链接——这就是链接器所说的“公共”的意思。在 C++ 中, 本身为 const 的变量具有内部链接 默认。你可能想要的是:

    extern char const* const TUTU __attribute__((weak)) = "TUTU";
    

    正式地说,这在 C++ 中是未定义的行为(没有 __attribute__,这不是 C++)。弱者的目的 属性是允许它,所有实例共享相同 内存(它导致未定义的行为,或至少 未指定,如果任何实例具有不同的 初始化器。

    其实:你可能想要的是:

    extern char const TUTU[] __attribute__((weak)) = "TUTU";
    

    无意义地引入指针。

    编辑:

    请注意,这是 C 和 C++ 之间的差异之一。在 C、const对联动没有影响。

    【讨论】:

      【解决方案2】:

      在 C++ 中,声明为 const 而未显式声明为 extern 的变量接收内部链接(即,如同声明为 static)。显然这不能与weak 属性结合使用。

      C 没有这个规则,所以符号获得外部链接,因此当你将它编译为 C 代码时,可以将属性应用到它。

      【讨论】:

      • 注意:char TUTU[] __attribute__((weak)) ="TUTU"; 编译没有问题,符合这个答案。
      猜你喜欢
      • 1970-01-01
      • 2011-12-16
      • 2014-03-06
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2017-04-06
      • 2015-07-05
      相关资源
      最近更新 更多