문제

#Warning 지침이 표준이 아니라는 것을 알고 있습니다 /C ++이지만 GCC/G ++를 포함한 여러 컴파일러가 지원합니다. 그러나 그것을지지하지 않는 사람들에게는 조용히 무시하거나 컴파일 실패를 초래할 것인가? 다시 말해, 지원하지 않는 컴파일러의 빌드를 깨지 않고 내 프로젝트에서 안전하게 사용할 수 있습니까?

도움이 되었습니까?

해결책

컴파일러가 #Warning을 지원하지 않으면 오류가 발생할 수 있습니다. #Pragma와 달리, 전처리자가 이해하지 못하는 지침을 무시할 것이라는 권장 사항은 없습니다.

그러나 나는 다양한 (합리적으로 일반적인) 플랫폼에서 컴파일러를 사용했으며 모두 #Warning을 지원했습니다.

다른 팁

MSVC는 구문을 사용한다는 점에 유의해야합니다.

#pragma message ( "your warning text here" )

일반적인 #Warning 구문은 치명적인 오류를 생성합니다

C1021: invalid preprocessor command 'warning'

따라서 해당 컴파일러에게는 휴대 할 수 없습니다.

코드 블록이 컴파일에 포함되지 않더라도 #Warning을 인식하지 못하는 컴파일러에서 인식 할 수없는 지침 경고를받을 수 있습니다. 이는 오류로 취급 될 수도 있고 아닐 수도 있습니다. 컴파일러는 합법적으로이를 오류로 취급 할 수 있지만 많은 사람들이 더 느슨 할 것입니다.

#Warning을 제공하는 GCC/G ++ 이외의 컴파일러를 알고 있습니까? [의 뜻편집 : Sun Solaris 10 (SPARC) 및 Studio 11 C/C ++ 컴파일러는 모두 #Warning을 허용합니다.

Atmel 프로세서를위한 컴파일러와 함께이 문제가 한 번있었습니다. 알 수없는 #Warning 토큰으로 인해 전처리 오류가 발생했습니다.

불행히도 솔루션은 전체 소스 트리를 변환하여 #pragma 동등한 것을 사용하고 GCC를 사용하는 경우 빌드 동작이 다를 수 있다는 것을 받아들이는 것 같습니다.

MINGW에서 Visual Studio로 전환 할 때 이러한 라인을 글로벌 구성 헤더에 추가했습니다. (stdafx.h에 포함)

#ifdef __GNUC__
//from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
//Instead of put such pragma in code:
//#pragma GCC diagnostic ignored "-Wformat"
//use:
//PRAGMA_GCC(diagnostic ignored "-Wformat")
#define DO_PRAGMA(x) _Pragma (#x)
#define PRAGMA_GCC(x) DO_PRAGMA(GCC #x)

#define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x)
#define PRAGMA_WARNING(x) DO_PRAGMA(warning #x)
#endif //__GNUC__
#ifdef _MSC_VER
/*
#define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off))
// These two lines are equivalent
#pragma optimize("", off)
PRAGMA_OPTIMIZE_OFF
*/
#define PRAGMA_GCC(x)
// https://support2.microsoft.com/kb/155196?wa=wsignin1.0
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") "
#define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x))
#define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x))

#endif

//#pragma message "message quoted"
//#pragma message message unquoted

//#warning warning unquoted
//#warning "warning quoted"

PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted)
PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted")

#warning "#pragma warning quoted"

PRAGMA_WARNING(PRAGMA_WARNING unquoted)
PRAGMA_WARNING("PRAGMA_WARNING quoted")

이제 나는 pragma_warning을 사용합니다 (이것은 수정해야합니다)

슬프게도 아무도 없습니다 #pragma warning GCC에서는 지정되지 않은 Pragma에게 경고합니다.

나는 GCC가 추가 할 것이라고 의심한다 #pragma warning" Microsoft 추가 대신 #warning.

실제로 내가 알고있는 대부분의 컴파일러는 알려지지 않은 #Pragma 지시문을 무시하고 경고 메시지를 출력합니다. 따라서 최악의 경우에도 경고를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top