我了解到的“包含”关键字只是复制和粘贴。
但是包含cpp文件会导致不同的编译结果。 (gcc6〜8 + boost1.69)
// main.cpp
#include <iostream>
// I'll move next code to why.cpp
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/archive/iterators/insert_linebreaks.hpp>
#include <boost/archive/iterators/remove_whitespace.hpp>
void testFunc()
{
using namespace boost::archive::iterators;
typedef transform_width<binary_from_base64<remove_whitespace<std::string::const_iterator>>, 8, 6> ItBinaryT;
std::string input;
std::string output(ItBinaryT(input.begin()), ItBinaryT(input.end()));
}
// -----------------------------
int main()
{
return 0;
}
上面的代码编译时没有警告。
但是,我用include cpp替换了一些代码。
// main.cpp
#include <iostream>
#include "why.cpp" // <----------
int main()
{
return 0;
}
// why.cpp - just copy&paste
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/archive/iterators/insert_linebreaks.hpp>
#include <boost/archive/iterators/remove_whitespace.hpp>
void testFunc()
{
using namespace boost::archive::iterators;
typedef transform_width<binary_from_base64<remove_whitespace<std::string::const_iterator>>, 8, 6> ItBinaryT;
std::string input;
std::string output(ItBinaryT(input.begin()), ItBinaryT(input.end()));
}
它发出警告[-Wsubobject-linkage]
~~有一个~~字段,其类型使用匿名名称空间
~~有一个基本~~,其类型使用匿名名称空间
请查看以下链接:https://wandbox.org/permlink/bw53IK2ZZP5UWMGk
什么与众不同?
答案 0 :(得分:0)
您的编译器会在以下前提下特别对待主CPP文件:该文件中定义的内容很少有一个以上的定义,因此,在该文件内未进行某些可能违反“一个定义规则”的测试。使用#include
会将您带到该文件之外。
我建议不要使用-Wsubobject-linkage
,因为它的逻辑基于不适用于您的代码的启发式方法。