首页 文章

静态const数据成员在另一个文件中定义

提问于
浏览
6

我正在为C 11开发静态分析器 . 类的静态const成员和链接之间存在交互,我不确定它是否已定义 . 我的静态分析器只有在未定义此构造时才应警告它 .

这个例子是这样的:

在文件f1.cpp中:

struct Foo {
    static const int x = 2;
};

int main(void) {
    return *&Foo::x;
}

并在文件f2.cpp中:

struct Foo {
    static int x;
};

int Foo::x;

编译并与 clang++ -std=c++11 -Weverything f1.cpp f2.cpp 链接的两个文件不会导致警告并生成返回0的二进制文件 . 使用 g++ -std=c++11 -Wall -Wextra -pedantic f1.cpp f2.cpp 编译时,相同的文件不会导致警告并返回2 .

我的直觉是这个程序定义不明确,但不需要警告,如:

  • 两个名字Foo :: x在N3376 [basic.link] p5之后有外部链接:

此外,成员函数,静态数据成员,[...]具有用于链接目的的typedef名称(7.1.3),如果类的名称具有外部链接,则具有外部链接 .

  • 但他们打破了N3376 [basic.link] p10的要求:

在对类型进行所有调整(其中typedefs(7.1.3)被其定义替换)之后,引用给定变量或函数的所有声明指定的类型应相同[...]违反此规则的类型身份不需要诊断 .

为了100%确定这一点,需要对这些“类型的所有调整”进行定义,但似乎无法在C 11标准中找到 . 有没有,上面的推理是正确的吗?

1 回答

  • 3

    这是ODR违规行为 . Foo类型在每个文件中都有不同的声明 .

    一个定义说x是用外部链接声明的(可以是任何东西,在链接时确定),另一个定义是一个值为2的编译时常量 .

相关问题