1

我正在创建一个仅限标头的库,并且我希望在编译期间显示它的警告。但是,似乎只显示包括库在内的“主”项目的警告,而不是库本身的警告。

有没有办法强制编译器检查包含库中的警告?

// main.cpp
#include "MyHeaderOnlyLib.hpp"
int main() { ... }

// Compile
g++ ./main.cpp -Wall -Wextra -pedantic ...

// Warnings get displayed for main.cpp, but not for MyHeaderOnlyLib.hpp

MyHeaderOnlyLib.hpp通过 CMake 脚本查找,使用find_package. 我检查了 CMake 执行的命令,它使用的是-I,而不是-isystem.

我已经尝试过将库包含在<...>(当它在/usr/include/目录中时),或者在本地包含"...".

4

1 回答 1

2

我想你有一个模板库,你抱怨它的编译没有警告。不要寻找糟糕的#include路径,那最终会成为错误。不幸的是,如果没有专门化(除非模板被.cpp. 考虑一下:

#include <vector>

template <class C>
struct T {
    bool pub_x(const std::vector<int> &v, int i)
    {
        return v.size() < i;
    }

    bool pub_y(const std::vector<int> &v, int i)
    {
        return v.size() < i;
    }
};

typedef T<int> Tint; // will not help

bool pub_z(const std::vector<int> &v, unsigned int i) // if signed, produces warning
{
    return v.size() < i;
}

class WarningMachine {
    WarningMachine() // note that this is private
    {
        //T<int>().pub_y(std::vector<int>(), 10); // to produce warning for the template
    }
};

int main()
{
    //Tint().pub_y(std::vector<int>(), 10); // to produce warning for the template
    return 0;
}

您可以在codepad中尝试一下。请注意pub_z,尽管从未被调用,但编译时会立即产生有符号/无符号比较警告。不过,对于模板来说,情况就完全不同了。即使T::pub_y被调用,T::pub_x仍然毫无预警地通过。这取决于编译器的实现,一旦所有信息都可用,一些编译器会执行更积极的检查,而其他编译器往往是懒惰的。请注意,既不依赖T::pub_x也不T::pub_y依赖于模板参数。

可靠地做到这一点的唯一方法是专门化模板并调用函数。请注意,执行此操作的代码不需要可访问(例如 in WarningMachine),使其成为优化的候选对象(但这取决于),并且还意味着传递给函数的值可能不需要有效值,因为代码永远不会运行(这将节省您分配数组或准备函数可能需要的任何数据)。

另一方面,由于您将不得不编写大量代码来真正检查所有功能,因此您最好传递有效数据并检查结果的正确性并使其有用,而不是让任何阅读的人感到困惑你之后的代码(在上述情况下很可能)。

于 2014-05-16T18:25:26.597 回答