É o max(A,b) definido em stdlib.h ou não?
5 answers
Qualquer biblioteca C que defina uma macro chamada {[[0]} em seus cabeçalhos padrão está quebrada além da imaginação. Felizmente, uma solução fácil se você precisa suportar tais plataformas é #undef max
(e quaisquer outras macros problemáticas que ele define) depois de incluir os cabeçalhos do sistema e antes de qualquer um dos seus próprios cabeçalhos/código.
Note que toda a gente está a dizer para embrulhar a sua definição em #ifndef max ... #endif
. Isto não é uma boa ideia. Definir max
num cabeçalho de sistema é uma indicação de que o implementor foi incompetente, e é possível que certas versões do ambiente tenham macros (por exemplo, que não protegem adequadamente argumentos com parênteses, mas eu até vi uma macro que estava incorretamente executando min
em vez de max
pelo menos uma vez na minha vida!). Use apenas #undef
e tenha cuidado.
Quanto à razão pela qual está tão quebrado para stdlib.h
definir {[[0]}, a norma C é muito específica sobre os nomes que estão reservados para a aplicação e que nomes são reservados para funções padrão e / ou uso interno pela implementação. Há boas razões para isso. Definir nomes de macro nos cabeçalhos do sistema que poderiam colidir com nomes de variáveis/funções usados no programa de aplicação é perigoso. No melhor caso, 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 nunca se sabe o que os nomes já serão tomados pela biblioteca.
Protege-o com um #ifndef
.
#ifndef max
#define max(a,b) ((a) > (b) ? (a) : (b))
#endif
Tenha em mente que a versão acima não é tão segura como uma função inline, por exemplo max(a++,b--)
irá causar resultados não detectados.
Não, Não É, está definido no windef.h em torno da linha 187:É o máximo(a,b) definido em stdlib.h ou não?
#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 */
Pode utilizar a compilação de condições:
#ifndef max
#define max(a,b) ...
#endif
No Visual C++, Se #define NOMINMAX
antes de incluir os cabeçalhos padrão, não irá obter uma macro max
ou min
.