#c #macros
#c #макросы
Вопрос:
У меня есть кодовая база, которая использует #define по-другому, чем я привык.
Я знаю, что, например, #define a 5
заменит переменную a на 5 в коде.
Но что бы это значило:
'#define MSG_FLAG 5, REG, MSGCLR'
Я попытался сделать это в простом коде и скомпилировать его. Оно принимает последнее значение (например, третий аргумент в виде MSGCLR).
Комментарии:
1.
MSG_FLAG
просто заменяется на5, REG, MSGCLR
везде. Оттуда вас интересует оператор запятой .2. Кстати .. все ли видят это
'
вокруг блока кода? При попытке редактирования их там нет..3. @EugeneSh. Я не думаю, что это оператор запятой
4. @AnttiHaapala «Это принимает последнее значение» вещь
5. @EugeneSh. … переходит в аргументы или список инициализации => не оператор запятой.
Ответ №1:
Предварительная обработка — это в основном просто замена строки, которая происходит перед началом «реальной» компиляции. Итак, на данный момент мы не имеем ни малейшего представления о том, что такое переменная.
Запятые здесь не являются каким-либо специальным синтаксисом. Это приведет к замене любого появления MSG_FLAG
в коде на 5, REG, MSGCLR
У большинства компиляторов есть флаг, который просто запускает препроцессор, так что вы можете убедиться сами. В gcc это -E.
Итак, чтобы проверить это, у нас может быть какой-нибудь бессмысленный источник:
#define MSG_FLAG 5, REG, MSGCLR
MSG_FLAG
Скомпилируйте с gcc -E test.c
И на выходе получается:
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
5, REG, MSGCLR
Комментарии:
1. Компилятор не увидит,
MSG_FLAG.
вместо этого увидит5, REG, MSGCLR
компилятор.2. требуется последний инициализатор
3. @ani что из этого следует?
4. Компилятор @immibis?
5. @ani Не могли бы вы показать, как это используется в коде? Возможно, это прояснит ситуацию