Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gcc 4.8.1: combining c code with c++11 code

Tags:

c

gcc

c++11

I have not made ​​much effort to discover the cause, but gcc 4.8.1 is giving me a lot of trouble to compile old sources that combine c and c++ plus some new stuff in c++11

I've managed to isolate the problem in this piece of code:

# include <argp.h>
# include <algorithm>

which compiles fine with g++ -std=c++0x -c -o test-temp.o test-temp.C version 4.6.3, ubuntu 12.04

By contrast, with version 4.8.1, the same command line throws a lot of errors:

In file included from /home/lrleon/GCC/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/x86intrin.h:30:0,
                 from /home/lrleon/GCC/include/c++/4.8.1/bits/opt_random.h:33,
                 from /home/lrleon/GCC/include/c++/4.8.1/random:51,
                 from /home/lrleon/GCC/include/c++/4.8.1/bits/stl_algo.h:65,
                 from /home/lrleon/GCC/include/c++/4.8.1/algorithm:62,
                 from test-temp.C:4:
/home/lrleon/GCC/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/mmintrin.h: In function ‘__m64 _mm_cvtsi32_si64(int)’:
/home/lrleon/GCC/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/mmintrin.h:61:54: error: can’t convert between vector values of different size
   return (__m64) __builtin_ia32_vec_init_v2si (__i, 0);
                                                      ^

... and much more.

The same happens if I execute

g++ -std=c++11 -c -o test-temp.o test-temp.C ; again, version 4.8.1

But, if I swap the header lines, that is

# include <algorithm>
# include <argp.h>

then all compiles fine.

Someone enlighten me to understand what is happening?

like image 509
lrleon Avatar asked Sep 27 '13 05:09

lrleon


People also ask

Is GCC C ++ 11?

GCC provides experimental support for the 2011 ISO C++ standard. This support can be enabled with the -std=c++11 or -std=gnu++11 compiler options; the former disables GNU extensions. As of GCC 4.8. 1, GCC's C++11 mode implements all of the major features of the C++11 standard produced by the ISO C++ committee.

Does GCC 4.8 support C ++ 17?

GCC has had complete support for C++17 language features since version 8. Clang 5 and later supports all C++17 language features.

Does GCC 11 support C ++ 20?

C++20 Support in GCC GCC has experimental support for the latest revision of the C++ standard, which was published in 2020. C++20 features are available since GCC 8. To enable C++20 support, add the command-line parameter -std=c++20 (use -std=c++2a in GCC 9 and earlier) to your g++ command line.


1 Answers

I ran into the same problem. As it is really annoying, I hacked it down to <argp.h>.

This is the code (in standard gcc header argp.h) which trigger the error on ubuntu 14.04 / gcc 4.8.2:

/* This feature is available in gcc versions 2.5 and later.  */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
#  define __attribute__(Spec) /* empty */
# endif

This is probably to make headers compatible with old gcc AND to strict ANSI C++ definition. The problem is that --std=c++11 set the __STRICT_ANSI__ macro.

I've commented the #define __attribute__(spec) and the compilation worked fine !

As it is not practical to comment a system header, a workaround is to use g++ --std=gnu++11 instead of g++ --std=c++11 as it does not define __STRICT_ANSI__. It worked in my case.

It seems to be a bug in gcc.

like image 155
neuro Avatar answered Oct 04 '22 09:10

neuro