Понимание различных объявлений #define

#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 Не могли бы вы показать, как это используется в коде? Возможно, это прояснит ситуацию