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

时间:2016-01-05 01:12:34

标签: c++ c++11 g++

我从these questions知道如果我在头文件中声明一个静态const变量:

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

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

const int Foo::BAR;

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

即使我的源代码中没有使用该变量,是否有办法强制gcc警告我是否忘记提供定义?如果以上Foo是共享库的一部分且未提供Foo::BAR的定义,则用户将无法通过引用传递Foo:BAR或获取指向它的指针,但作为图书馆作家,我没有表明这是一个问题。

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

1 个答案:

答案 0 :(得分:1)

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

检查的简单方法是对库接口进行适当的单元测试(如评论中所示),然后在链接单元测试时就可以确定。