2012-06-26 2 views
13

У меня есть макрос, который передает номер строки и имя файла в качестве обработчика ошибок:Поведения __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__ содержать номер строки в файле заголовка или номер строки исходного файла, в котором встраиваемая функция называется (предполагая, что компилятор делает «вставить» в исходном коде)?

+2

Невозможно попробовать, так как поведение может отличаться в отношении компиляторов и может не соответствовать стандарту. –

+2

Downvoters: Почему downvote? Вопрос возникает из-за использования встроенных функций C и макросов во встроенной системе. –

+1

@Thomas, тестируя это на своем собственном компиляторе и включающий результаты в ваш вопрос (тем самым, более похожим на мой препроцессор, делает это стандартным?) Будет (и все еще может) переводить многие из downvotes. –

ответ

20

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

7

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

3

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

Смежные вопросы