Как запретить «примечание C6311» в компиляторе Microsoft C? - PullRequest
1 голос
/ 20 апреля 2010

В этом примере с максимально обрезанным источником константа манифеста FOOBAR переопределяется. Это является преднамеренным, и в реальном случае имеется дополнительный код для использования каждого определения.

Прагма была добавлена, чтобы избавиться от предупреждающего сообщения, но затем появилась заметка, и я, похоже, не нашел способа избавиться от заметки.

Мне удалось изменить этот конкретный источник на #undef между #define, но я хотел бы знать, есть ли способ запретить ноту, не требуя #undef, поскольку обрабатывается несколько констант так же.

#pragma warning( disable : 4005 ) // 'identifier' : macro redefinition
#define FOOBAR FOO
#define FOOBAR BAR

Баннер компилятора и выходные данные выглядят следующим образом

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

message.c
message.c(3) : note C6311: message.c(2) : see previous definition of 'FOOBAR'

1 Ответ

6 голосов
/ 20 апреля 2010

Вам не разрешается переопределять макрос, если только новое определение не совпадает с текущим определением (если вы переопределите макрос и новое определение будет отличаться от текущего определения, программа фактически не сформирована).

#undef Использование макроса перед его переопределением является правильным решением в этом случае:

#undef FOOBAR
#define FOOBAR FOO


#undef FOOBAR
#define FOOBAR BAR

Обратите внимание, что вы можете использовать #undef, даже если имя макроса не установлено.в настоящее время не определено, поэтому нет смысла проверять, определен ли макрос с помощью #ifdef, прежде чем использовать #undef.

...