2013-06-21 2 views
-4

я макрос объявлен как таковой:Использование __FILE__ и __LINE__ в определенный пользователем макрос

#define Ex(a) { throw MyException((a), __LINE__, __FILE__); } 

И я использую это так:

if (bad_things_happen) Ex(error_code) 

Будут ли эти макросы содержат строку и файл инструкции #define, или заявление if? Если они содержат строки и файл с #define заявления, то мой макрос, по существу бесполезно ...

+6

Почему бы вам просто не проверить его и выяснить – aaronman

ответ

1

Нет, он расширяется в строке, в которой вы его используете:

__LINE__ Этот макрос раскрывается в текущий номер строки ввода, в виде десятичной целочисленной константы. Хотя мы называем это предопределенным макросом, это довольно странный макрос, поскольку его «определение» изменяется с каждой новой строкой исходного кода.

Что касается файла:

__FILE__ Этот макрос раскрывается в имя текущего входного файла, в виде строки C постоянной. Это путь, по которому препроцессор открыл файл, а не краткое имя, указанное в «#include» или в качестве аргумента имени входного файла. Например, «/usr/local/include/myheader.h» является возможным расширением этого макроса.

+0

... но в этом случае означает, что «где вы его используете» означает? – creXALBO

+1

@creXALBO Он будет расширяться до текущей строки, а не там, где был определен макрос. Макрос - это просто замена текста. – 0x499602D2

+1

Вопрос creXALBO вполне справедлив ... что макрос просто заменяет текст, действительно не помогает объяснить, поскольку, как говорится в тексте, '__LINE__' является« довольно странным »макросом, который * не * просто заменяет текст, поскольку его изменения стоимости. Вы должны уточнить свой ответ, чтобы указать, что '__LINE__' имеет значение исходной строки, где оно разворачивается, а не там, где это происходит. (Ваш комментарий выше не является частью ответа.) –