2012-06-26 12 views
13

Mam makro, które przechodzi linia numer i nazwę pliku do obsługi błędu:Zachowanie __LINE__ funkcje inline

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

Jak będzie __LINE__ być rozwiązane przy zastosowaniu wewnątrz inlined funkcji?

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; 
} 

Will __LINE__ zawierać numer linii w pliku nagłówka lub numer wiersza w pliku źródłowym, w którym funkcja inline nazywa (zakładając, że kompilator robi „wklej” w kodzie źródłowym)?

+2

Nie można tego wypróbować, ponieważ zachowanie może się różnić w przypadku kompilatorów i może nie być zgodne z tym, co stwierdza standard. –

+2

Downwotrzy: Dlaczego upadek? Pytanie wynika z użycia C, wbudowanych funkcji i makr w systemie wbudowanym. –

+1

@Thomas, testowanie tego na własnym kompilatorze i uwzględnianie wyników w twoim pytaniu (w ten sposób czyniąc to bardziej jak "mój preprocesor robi to, czy to jest standard?") Miałoby (i nadal może) nijak wiele z notatek. –

Odpowiedz

20

W językach C i C++ makra nie są (w większości przypadków) oceniane przy pomocy dowolnej wiedzy o rzeczywistym kodzie i są przetwarzane przed kodem (stąd nazwa "preprocesor"). W związku z tym __FILE__ zostanie oceniony jako "file.h", a __LINE__ oceni na numer linii odpowiadający linii, na której SYSTEM_FAILURE pojawia się w pliku.h.

7

Ponieważ makra są zastępowane przez ich definicje przed kompilacją, __LINE__ będzie zawierał rzeczywistą linię pliku, w którym użyto makra. Inlining w ogóle nie wpłynie na to zachowanie.

3

__LINE__ będzie wierszem pliku nagłówkowego, ponieważ preprocesor oceni go przed zobaczeniem kompilatora.

Powiązane problemy