Использовать директиву препроцессора #define странным образом - PullRequest
2 голосов
/ 22 апреля 2011

Сегодня я только что закончил читать и экспериментировать на C о том, как использовать #define для создания манифестной константы, после того, как что-то пришло мне в голову, и ниже приведен код.

#include <stdio.h>
#define dummy main
#define yam {
#define apple }

int dummy(void)        //constant substitution main with dummy
yam                          // constant substitution { with yam
  printf("It works!!\n");
  return 0;
apple                           //constant substitution } with apple

Как и ожидалось, это работает как шарм, мне просто интересно, почему что-то подобное не вызывало никакой ошибки, может быть, я мог бы понять, почему main() можно заменить, потому что main является идентификатором (имя, данное функции переменная и постоянная), но почему {} можно заменить символическим именем? Во-вторых, какой тип данных C используется для хранения этой символьной константы, которая не является символом, заключенным в одинарные кавычки "", ни целым числом или числом с плавающей запятой.

Ответы [ 4 ]

7 голосов
/ 22 апреля 2011

Операторы #define оцениваются препроцессором до фактической компиляции программы , поэтому компилятор никогда не видит yam.Препроцессор выполняет прямую подстановку текста.

То есть, когда компилятор видит ваш код, он выглядит так:

int main(void)        //constant substitution main with dummy
{                          // constant substitution { with yam
  printf("It works!!\n");
  return 0;
}                           //constant substitution } with apple
2 голосов
/ 22 апреля 2011

#define обрабатывается препроцессором. Материал будет заменен символ за символом, прежде чем компилятор скомпилирует код. По сути, вы можете скрыть весь код, используя #define, но любой, у кого есть прекомпилятор, может позже его скрыть. Препроцессор заменяет все вхождения указанной вами «константы», кроме случаев, когда она заключена в кавычки (например, char *test="dumy yam apple"; останется без изменений).

2 голосов
/ 22 апреля 2011

Это работает, потому что препроцессор является процессором * PRE *, т.е. это то, что происходит перед реальной обработкой.

Таким образом, препроцессор выполняет свои грубые замены текста перед реальным компиляторомполучает посмотреть на код.

2 голосов
/ 22 апреля 2011

Определение буквально текстовой замены. На этапах препроцессора, компилятор проверит ваш код и заменит все dummy на main, yam на { и apple на }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...