определить макрос как белье - PullRequest
4 голосов
/ 19 марта 2020

Можно ли определить макрос, чтобы он имел значение строки, в которой он определен?

Я знаю о __LINE__, но он расширяется слишком поздно.

#define MYLINE __LINE__  // line 1
printf("%d\n", MYLINE);  // line 2
printf("%d\n", MYLINE);  // line 3

выше не делает то, что я хочу. Я хотел бы, чтобы он напечатал 1 дважды, но вместо этого он печатает 2 и 3.

Ответы [ 2 ]

4 голосов
/ 19 марта 2020

Макрос подобен текстовой замене (т. Е. MYLINE везде заменяется __LINE__). Вы не сможете этого сделать.

Вы можете использовать константу, однако:

const int line = __LINE__;
printf("line %d\n", line);
printf("line %d\n", line);
3 голосов
/ 19 марта 2020

Нет, потому что:

  • __LINE__ - это имя макроса. (C 2018 6.10.8 1)
  • «Жетоны предварительной обработки в директиве предварительной обработки не подлежат расширению макросов, если не указано иное». (C 2018 6.10 7)
  • В спецификации директив # define не указано иное. (C 2018 6.10.3)

Таким образом, замена макроса может происходить только тогда, когда макрос используется впоследствии; это не может происходить в самой директиве # define.

Вы можете определить константы с помощью номера строки, например static const int MyLine = __LINE__;.

...