Existe uma maneira limpa para evitar que windows.h de criar um perto e longe macro?

StackOverflow https://stackoverflow.com/questions/118774

  •  02-07-2019
  •  | 
  •  

Pergunta

No fundo do Windef.h há essa relíquia da era de memória segmentada:

#define far
#define near

Isso obviamente causa problemas se você tentar usar perto ou longe como nomes de variáveis. Quaisquer soluções alternativas limpas? Outros, em seguida, renomear meus variáveis?

Foi útil?

Solução

Você pode seguramente undefine eles, contrariamente às afirmações de outros. A razão é que eles são apenas macros do. Eles só afetam o pré-processador entre sua definição e sua indefinição. No seu caso, que será de no início windows.h para a última linha de windows.h. Se você precisa de cabeçalhos janelas extra, você incluí-los após windows.h e antes do #undef. Em seu código, o pré-processador irá simplesmente deixar os símbolos inalterada, como pretendido.

O comentário sobre o código mais velho é irrelevante. Esse código será em uma biblioteca separada, compiladas de forma independente. Apenas em tempo de ligação vai estes ser ligados, quando macros estão muito longe.

Outras dicas

Undefine qualquer macros que você não quer após incluindo windows.h:

#include <windows.h>
#undef near
#undef far

talvez:

#undef near
#undef far

pode ser perigoso embora ...

Você provavelmente não quer indefinido perto e de longe em todos os lugares. Mas quando você precisa usar os nomes de variáveis, você pode usar o seguinte para não definir a macro local e adicioná-lo de volta quando você está feito.

#pragma push_macro("near")
#undef near
//your code here.
#pragma pop_macro ("near")

Melhor não. Eles são definidos para compatibilidade com código antigo -. Se você se livrou deles de alguma forma e, em seguida, mais tarde necessário para usar parte desse código antigo que você estaria quebrado

Pode-se argumentar que "perto" e "longe" não são nomes de variáveis ??muito descritivos. Você já pensou em simplesmente fornecer detalhes adicionais em seu nome variável para resolver o conflito (ou seja nearest_match, furthest_match). Apenas um pensamento.

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