Понимание различных объявлений #define - PullRequest
0 голосов
/ 28 марта 2019

У меня есть кодовая база, которая использует #define иначе, чем я привык.

Я знаю, что, например, #define a 5 заменит переменную a на 5 в коде.

Но что бы это значило:

'#define MSG_FLAG 5, REG, MSGCLR'

Я попытался сделать это в простом коде и скомпилировать его.Он принимает последнее значение (как и третий аргумент как MSGCLR).

1 Ответ

5 голосов
/ 28 марта 2019

Предварительная обработка - это в основном просто замена строк, которая происходит до того, как начинается «настоящая» компиляция. Таким образом, мы не имеем ни малейшего представления о том, что такое переменная на данный момент.

Запятые здесь не являются специальным синтаксисом. Это приведет к тому, что любое появление 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...