Если вы переопределите его, вам нужно переопределить его, используя точно такой же список токенов предварительной обработки.Это верно для макрокоманд функции и макрокоманд объекта.
С 6.10.3 Macroreplacement p2
:
Идентификатор, определенный в настоящее время как объектоподобный макрос не должен переопределяться другой директивой предварительной обработки #define, если только второе определение не является объектно-подобным определением макроса и два списка замены не идентичны.
Аналогично, идентификатор, в настоящее время определяемый как функция-например, макрос не должен переопределяться другой директивой предварительной обработки #define, если только второе определение не является функционально-подобным определением макроса, которое имеет одинаковое число и написание параметров, а два списка замены идентичны.
Так что в этих определениях используется shall
.
Теперь, с 4.Conformance p2
:
Если '' должен '' или 'не должен' 'требование, которое появляется вне ограничения, нарушено, поведение не определено.
Это официальное определение.Таким образом, не удаляя символ макроса из среды препроцессора (используя #undef) перед его переопределением, вы получите неопределенное поведение.
В случае, если вы обнаружите другую ситуацию в некоторых реализациях C, это не будет стандартизировано.
Правильно было бы вставить различные определения в функцию некоторого условия, которое вы задали снаружи:
#if COND
#define M M1
#else
#define M M2
#endif
Если вы используете какую-то библиотеку, которая переопределяет ее, наверняка есть некоторые макросы, которые устанавливают COND
и делают вещи хорошо определенными.Вам нужно научиться пользоваться библиотекой.Переопределение его с другим списком токенов pp недопустимо.