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

Estou a usar dois computadores, cada um com uma versão diferente do visual studio. No visual studio 2008, o meu código compila. No computador visual 2010 o meu código não compila porque estou a usar a macro {[[0]} que, tanto quanto sei, é definida em stdlib.h. não posso apenas definir {[[[[]} porque será uma redefinição no computador visual 2008. Mas se eu não definir o meu código não compila no computador visual 2010.

Alguma solução?

Author: snakile, 2010-11-20

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.

 27
Author: R.., 2010-11-20 17:40:29

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.

 4
Author: John Ledbetter, 2015-03-26 19:59:21
Então, respondendo à sua pergunta principal:

É o máximo(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 */
 3
Author: Calmarius, 2014-05-26 15:53:20

Pode utilizar a compilação de condições:

#ifndef max
  #define max(a,b) ...
#endif
 0
Author: Vladimir Ivanov, 2010-11-20 17:29:08

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

 0
Author: Bill Lynch, 2010-11-20 17:33:06