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
nombresstd
)? - ¿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