缺少包含不会在 RedHat 6 上产生编译错误
Missing include gives no compile error on RedHat 6
此代码段无法编译,因为 std::accumulate 在 header numeric
中找到,而 numeric
未包含在内。
#include <algorithm>
#include <vector>
int main () {
std::vector<int> vec{ 1, 2, 3, 4 };
return std::accumulate(vec.begin(), vec.end(),0);
}
compiler explorer 给出了正确的错误信息
<source>(6): error: namespace "std" has no member "accumulate"
return std::accumulate(vec.begin(), vec.end(),0);
我使用的是 RedHat 6 和 intel 编译器版本 18.0.3。如果我用这个设置编译它,我不会出错并且结果很好。即使使用 -Wall
也不会显示警告。
我的问题是,为什么我没有收到相应的错误消息?
why don't I get an appropriate error message?
因为您用于编译的标准库头文件之一 <algorithm>
或 <vector>
确实包含 <numeric>
本身。这是一个常见的可移植性问题;您的代码恰好使用特定的标准库实现进行编译,但无法使用另一个实现进行构建。库实现可以自由地将标准头文件包含在标准头文件中。也许您 <algorithm>
中的某些功能是使用任何 <numeric>
算法实现的,而您就是这样。
您遇到的编译器错误是 include-what-you-use 等工具存在的原因。使用 iwyu
her 会将 #include <numeric>
添加到您的代码段中。另请注意,没有警告标志会影响编译结果。要么出现硬编译器错误,要么什么都没有。
此代码段无法编译,因为 std::accumulate 在 header numeric
中找到,而 numeric
未包含在内。
#include <algorithm>
#include <vector>
int main () {
std::vector<int> vec{ 1, 2, 3, 4 };
return std::accumulate(vec.begin(), vec.end(),0);
}
compiler explorer 给出了正确的错误信息
<source>(6): error: namespace "std" has no member "accumulate"
return std::accumulate(vec.begin(), vec.end(),0);
我使用的是 RedHat 6 和 intel 编译器版本 18.0.3。如果我用这个设置编译它,我不会出错并且结果很好。即使使用 -Wall
也不会显示警告。
我的问题是,为什么我没有收到相应的错误消息?
why don't I get an appropriate error message?
因为您用于编译的标准库头文件之一 <algorithm>
或 <vector>
确实包含 <numeric>
本身。这是一个常见的可移植性问题;您的代码恰好使用特定的标准库实现进行编译,但无法使用另一个实现进行构建。库实现可以自由地将标准头文件包含在标准头文件中。也许您 <algorithm>
中的某些功能是使用任何 <numeric>
算法实现的,而您就是这样。
您遇到的编译器错误是 include-what-you-use 等工具存在的原因。使用 iwyu
her 会将 #include <numeric>
添加到您的代码段中。另请注意,没有警告标志会影响编译结果。要么出现硬编译器错误,要么什么都没有。