Marcel Pfütze created AVRO-2598:
-----------------------------------

             Summary: C++ standard of library defines C++ standard of libraries 
using Avro
                 Key: AVRO-2598
                 URL: https://issues.apache.org/jira/browse/AVRO-2598
             Project: Apache Avro
          Issue Type: Bug
          Components: c++
    Affects Versions: 1.9.1, 1.9.0
            Reporter: Marcel Pfütze


SInce Avro 1.9.0 there is an if macro in a lot of headers that uses the current 
C++ standard.
 If you build the library from source and use it in another project this can 
lead to segfaults.

Example of macro:
{code:c++}
template<typename T> T& GenericDatum::value() {
    return (type_ == AVRO_UNION) ?
#if __cplusplus >= 201703L
        std::any_cast<GenericUnion>(&value_)->datum().value<T>() :
        *std::any_cast<T>(&value_);
#else
        boost::any_cast<GenericUnion>(&value_)->datum().value<T>() :
        *boost::any_cast<T>(&value_);
#endif
{code}
In our case we build the library from source (which uses the c++11 by default) 
and used it in a project using C++17. There's very little indication to the 
user why this happens.

My proposals:
 * Move implementation from header to source file so that the used standard is 
decided at build time.
 * Use the [CMAKE_CXX_STANDARD 
|https://cmake.org/cmake/help/v3.1/variable/CMAKE_CXX_STANDARD.html] 
functionality provided by cmake to set the standard. In this way the standard 
can also easily set when building the code without actually manipulating the 
CMakeLists.txt file. Of course the --std=c++11 
[here|https://github.com/apache/avro/blob/89218262cde62e98fcb3778b86cd3f03056c54f3/lang/c%2B%2B/CMakeLists.txt#L55]
 can be removed.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to