为什么包含cpp会产生不同的结果

时间:2019-03-22 22:42:27

标签: c++11 boost

我了解到的“包含”关键字只是复制和粘贴。

但是包含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

什么与众不同?

1 个答案:

答案 0 :(得分:0)

您的编译器会在以下前提下特别对待主CPP文件:该文件中定义的内容很少有一个以上的定义,因此,在该文件内未进行某些可能违反“一个定义规则”的测试。使用#include会将您带到该文件之外。

我建议不要使用-Wsubobject-linkage,因为它的逻辑基于不适用于您的代码的启发式方法。