c++ c++11 header clang c++14

Clang>=3.3 en modo c++ 1y no puede analizar el encabezado<cstdio>



c++11 header (1)

Tengo un proyecto que se compila correctamente y se ejecuta bajo g ++ 4.8.1 y clang> = 3.3 en modo c ++ 11. Sin embargo, cuando cambio al modo experimental -std=c++1y , clang 3.3 (pero no g ++) se ahoga en el encabezado <cstdio> que indirectamente se incluye a través de Boost.Test (por lo que no puedo cambiarlo fácilmente)

// /usr/include/c++/4.8/cstdio #include <stdio.h> // Get rid of those macros defined in <stdio.h> in lieu of real functions. // ... #undef gets // ... namespace std { // ... using ::gets; // <-- error with clang++ -std=c++1y // ... }

con el siguiente mensaje de error:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11: error: ningún miembro llamado ''obtiene'' en el mundo espacio de nombres

En este tutorial sobre cómo configurar un entorno moderno de C ++, se encuentra un problema de búsqueda similar con max_align_t . La recomendación es usar una secuencia de comandos sed para rodear los símbolos desconocidos con las macros #ifdef __clang__ , pero parece un enfoque frágil.

Configuración: Linux Mint 15 de 64 bits con

g ++ (Ubuntu 4.8.1-2ubuntu1 ~ 13.04) 4.8.1

Ubuntu clang versión 3.3-3 ~ raring1 (branches / release_33) (basado en LLVM 3.3)

Preguntas :

  • ¿Qué está causando este error? No hay macro __clang__ ninguna parte cerca del código en cuestión, y clang en modo c ++ 11 no tiene ningún problema.
  • ¿Es un problema de lenguaje (C ++ 14 dice algo más que C ++ 11 sobre la importación de símbolos compatibles con C del global al std nombres std )?
  • ¿Debo cambiar algo con mis rutas de inclusión? (Uso CMake para seleccionar automáticamente las rutas de encabezado y cambiar los modos dentro de CMakeLists.txt)
  • ¿Tiene clang un interruptor para resolver esto?

Esta nota en la página de manual de gets ve relevante:

ISO C11 elimina la especificación de gets () del lenguaje C, y desde la versión 2.16, los archivos de encabezado glibc no exponen la declaración de función si se define la macro de prueba de la característica _ISOC11_SOURCE .

Probablemente debería ser

#if !_ISOC11_SOURCE using ::gets; #endif