Подтвердить что ты не робот

Поведение __LINE__ в встроенных функциях

У меня есть макрос, который передает номер строки и имя файла обработчику ошибок:

#define SYSTEM_FAILURE (error_code, comment) \
   System_Failure((error_code), (comment), __LINE__, __FILE__);

Как будет разрешаться __LINE__ при использовании внутри встроенной функции?

file.h:
inline int divide(int x, int y)
{
    if (y == 0)
    {
        SYSTEM_FAILURE(ENUM_DIVIDE_BY_ZERO, "divide by zero error");
    }
    return x/y;
}

Будет ли __LINE__ содержать номер строки в файле заголовка или номер строки исходного файла, в котором вызывается встроенная функция (предполагается, что компилятор выполняет "вставку" в исходном коде)?

4b9b3361

Ответ 1

В C и С++ макросы не (по большей части) оцениваются с любым знанием фактического кода и обрабатываются перед кодом (отсюда и название "препроцессор" ). Поэтому __FILE__ будет оценивать значение "file.h", а __LINE__ будет оценивать номер строки, соответствующий строке, на которой SYSTEM_FAILURE появляется в файле .h.

Ответ 2

Поскольку макросы заменяются их определениями до компиляции, __LINE__ будет содержать фактическую строку файла, в котором вы использовали макрос. Вложение не повлияет на это поведение вообще.

Ответ 3

__LINE__ будет строкой файла заголовка, так как препроцессор будет оценивать его до того, как компилятор когда-либо увидит его.