ti-enxame.com

É max (a, b) definido em stdlib.h ou não?

Eu estou usando dois computadores, cada um com uma versão diferente do visual studio. No computador visual studio 2008, meu código é compilado. No computador visual de 2010, meu código não é compilado porque estou usando a macro max(a,b) que, até onde sei, está definida em stdlib.h. Não posso definir apenas max(a,b) porque será uma redefinição no computador visual de 2008. Mas se eu não definir max(a,b), meu código não será compilado no computador visual de 2010.

Qualquer solução?

17
snakile

Qualquer biblioteca C que defina uma macro chamada max em seus cabeçalhos padrão é quebrada além da imaginação. Felizmente, uma solução fácil se você precisar dar suporte a essas plataformas é #undef maxe quaisquer outras macros problemáticas definidas) depois de incluir os cabeçalhos do sistema e antes de qualquer um dos seus cabeçalhos/códigos.

Note que todo mundo está dizendo para envolver sua definição em #ifndef max ... #endif. Isso é _ (nãouma boa idéia. Definir max em um cabeçalho do sistema é uma indicação de que o implementador era incompetente, e é possível que certas versões do ambiente tenham incorrect macros (por exemplo, aquelas que não proteja os argumentos corretamente com parênteses, mas eu até vi uma macro max que estava executando incorretamente min em vez de max pelo menos uma vez na minha vida!) Apenas use #undef e seja seguro.

Quanto ao motivo pelo qual ele é tão quebrado para stdlib.h definir max, o padrão C é muito específico sobre quais nomes são reservados para o aplicativo e quais nomes são reservados para funções padrão e/ou uso interno pela implementação. Existem boas razões para isso. Definir nomes de macro em cabeçalhos de sistema que poderiam colidir com nomes de variáveis ​​/ funções usados ​​no programa aplicativo é perigoso. No melhor dos casos, leva a erros de tempo de compilação com uma causa óbvia, mas em outros casos pode causar um comportamento muito estranho que é difícil de depurar. Em qualquer caso, torna muito difícil escrever código portátil porque você nunca sabe quais nomes já serão usados ​​pela biblioteca.

28
R..

Então respondendo sua pergunta principal:

É max (a, b) definido em stdlib.h ou não?

Não, não está definido no windef.h em torno da linha 187:

#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */
4
Calmarius

Proteja-o com um #ifndef

#ifndef max
    #define max(a,b) ((a) > (b) ? (a) : (b))
#endif

Lembre-se de que a versão acima não é tão segura quanto uma função in-line, por exemplo, max(a++,b--) causará resultados inesperados.

4
John Ledbetter

você pode usar a compilação de condição:

#ifndef max
  #define max(a,b) ...
#endif
0
Vladimir Ivanov

No Visual C++, se você #define NOMINMAX antes de incluir os cabeçalhos padrão, você não obterá uma macro max ou min.

0
Bill Lynch