GCC警告已声明但未定义的变量

GCC warn about declared but undefined variable

本文关键字:未定义 变量 声明 警告 GCC      更新时间:2023-10-16

我从这些问题中知道,如果我在头文件中声明一个静态常量变量:

Foo
{
public:
    static const int BAR = 1234;
    ...
};

我还必须在源文件中定义它:

const int Foo::BAR;

然而,如果程序中没有使用该变量,it gcc将很乐意忽略此要求。此外,如果启用了优化,gcc似乎很乐意掩盖一些简单的用法(例如通过const引用传递给std::min)。

如果我忘记提供定义,即使在我的源代码中没有使用该变量,有没有办法强制gcc发出警告?如果上面的Foo是共享库的一部分,并且没有提供Foo::BAR的定义,则用户将无法通过引用传递Foo:BAR或获取指向它的指针,但作为库编写器的我没有得到任何指示,表明这是一个问题。

更一般地说,是否有一种方法可以强制共享库中的所有声明都有相应的定义?或者这会在优化机会方面牺牲太多而不值得吗?

您用语言标记了这个问题,所以……代码在技术上是合法的,因为标准只需要在最终程序中使用定义。编译器不知道你是否要链接到另一个定义符号的翻译单元,所以即使生成警告也很棘手,可能会生成误报。

检查的简单方法是正确地对库接口进行单元测试(如注释中所建议的),然后在链接单元测试时就可以确定了。