vendredi 22 mars 2019

Why include cpp makes different result

l learned "include" keyword are just copy & paste.

But including cpp file makes different compile result. (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;
}

Above code compiled without warning.

But, I replace some code with 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()));
}

It makes warning [-Wsubobject-linkage]

  • ~~ has a field ~~ whose type uses the anonymous namespace

  • ~~ has a base ~~ whose type uses the anonymous namespace

Please look at this link : https://wandbox.org/permlink/bw53IK2ZZP5UWMGk

What makes this difference?

Aucun commentaire:

Enregistrer un commentaire