Pergunta

Eu sei que a directiva #warning não é padrão C / C ++, mas vários compiladores apoiá-lo, incluindo gcc / g ++. Mas para aqueles que não apoiá-lo, eles vão silenciosamente ignorá-lo ou vai resultar em uma falha de compilação? Em outras palavras, eu posso usá-lo com segurança no meu projeto sem quebrar a construção de compiladores que não apoiá-lo?

Foi útil?

Solução

É provável que, se um compilador não suporta #WARNING, então ele vai emitir um erro. Ao contrário #pragma, não há nenhuma recomendação de que o pré-processador ignorar directivas que não entende.

Dito isto, eu usei compiladores em várias plataformas diferentes (razoavelmente comum) e todos eles têm #warning suportado.

Outras dicas

Deve-se notar que MSVC usa a sintaxe:

#pragma message ( "your warning text here" )

A sintaxe #warning habitual gera um erro fatal

C1021: invalid preprocessor command 'warning'

por isso não é portátil para esses compiladores.

É provável que você conseguir pelo menos um aviso directiva não reconhecida de compiladores que não reconhecem #WARNING, mesmo que o bloco de código não está incluído na sua compilação. Isso pode ou não pode ser tratada como um erro -. O compilador poderia legitimamente tratá-la como um erro, mas muitos seria mais frouxa

Você está ciente de (você pode nomear) um compilador diferente do GCC / G ++ que fornece #WARNING? [ editado:. Sun Solaris 10 (SPARC) eo estúdio 11 C / compiladores C ++ ambos aceitar #WARNING]

Eu tive esse problema uma vez com um compilador para um processador Atmel. E ele fez gerar erros de pré-processamento devido ao desconhecido #WARNING token.

Infelizmente a solução parecia ser para converter a árvore de código inteiro para usar o equivalente #pragma e aceitar que o comportamento de construção estava indo para diferir se estiver usando gcc.

Ao mudar de mingw para o estúdio visual, eu adicionei essas linhas ao meu cabeçalho de configuração global. (Incluí-lo em 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")

Agora eu uso PRAGMA_WARNING (essa necessidade de ser fixado)

Infelizmente não há #pragma warning no gcc, por isso avisa pragma não especificado.

duvido que gcc irá adicionar #pragma warning" em vez de #warning acrescentando microsoft.

Na verdade, a maioria dos compiladores que eu sei sobre ignorar directivas #pragma desconhecidos e saída uma mensagem de aviso - para que, no pior caso, você ainda vai receber um aviso

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top