gpt4 book ai didi

c++ - 无法获得适用于仅 header 库的警告

转载 作者:行者123 更新时间:2023-11-30 04:04:59 25 4
gpt4 key购买 nike

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

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

// 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/ 目录中时),或在本地使用 "..." .

最佳答案

我假设您有一个模板库,并且您提示其编译时缺少警告。不要寻找错误的 #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_xT::pub_y 都不依赖于模板参数。

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

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

关于c++ - 无法获得适用于仅 header 库的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23535851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com