Clang> = 3.3 im c ++ 1y-Modus kann den <cstdio> -Header nicht analysieren

Ich habe ein Projekt, das unter g ++ 4.8.1 und clang> = 3.3 im c ++ 11-Modus korrekt kompiliert und ausgeführt wird. Wenn ich jedoch auf das Experimental umsteige-std=c++1y Modus, klingeln 3.3 (aber nicht g ++) Drosseln auf der<cstdio> Header, der indirekt über Boost.Test eingebunden wird (daher kann ich ihn nicht einfach selbst ändern)

// /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
// ...
}

mit folgender Fehlermeldung:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11: Fehler: Kein Mitglied mit dem Namen 'gets' in der globalen Liste Namespace

Aufdieses Tutorial über das Einrichten einer modernen C ++ - Umgebung, ein ähnliches Suchproblem mitmax_align_t angetroffen wird. Die Empfehlung dort ist, ein sed-Skript zu verwenden, um die unbekannten Symbole mit zu umgeben#ifdef __clang__ Makros, aber das scheint ein fragiler Ansatz.

Setup: 64-Bit Linux Mint 15 mit

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

Ubuntu Clang Version 3.3-3 ~ raring1 (branches / release_33) (basierend auf LLVM 3.3)

Fragen:

Was ist die Ursache dieses Fehlers? Es gibt kein__clang__ Makro irgendwo in der Nähe des fraglichen Codes und das Klirren im C ++ 11-Modus hat überhaupt keine Probleme.Handelt es sich um ein Sprachproblem (sagt C ++ 14 etwas anderes als C ++ 11 über das Importieren von C - kompatiblen Symbolen aus dem globalen in dasstd Namespace)?Muss ich mit meinen Include-Pfaden etwas ändern? (Ich verwende CMake, um die Header-Pfade automatisch auszuwählen und den Modus in CMakeLists.txt zu wechseln.)Hat Clang einen Schalter, um dies zu beheben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage