2012-06-26 14 views
13

Ho una macro che passa il numero di riga e il nome del file a un gestore di errori:Comportamento di __LINE__ a funzioni inline

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

Come sarà il __LINE__ essere risolto quando viene utilizzato all'interno di una funzione inline?

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

Sarà __LINE__ contenere il numero di riga all'interno del file di intestazione, o il numero di riga del file di origine in cui la funzione inline viene chiamata (assumendo compilatore non un "incolla" nel codice sorgente)?

+2

Impossibile provarlo in quanto il comportamento potrebbe essere diverso sui compilatori e potrebbe non essere lo stato standard. –

+2

Downvoters: perché il downvote? La domanda nasce dall'uso di C, funzioni inline e macro in un sistema embedded. –

+1

@Thomas, testando questo sul tuo compilatore e includendo i risultati nella tua domanda (rendendo così più simile a "il mio preprocessore fa questo, è standard?") Avrebbe (e può ancora) neutralizzare molti dei downvotes. –

risposta

20

In C e C++, le macro non sono (per la maggior parte) valutate con alcuna conoscenza del codice effettivo e vengono elaborate prima del codice (da cui il nome "preprocessore"). Pertanto, __FILE__ valuterà in "file.h" e __LINE__ valuterà il numero di riga corrispondente alla riga su cui appare SYSTEM_FAILURE in file.h.

7

Poiché le macro vengono sostituite dalle rispettive definizioni prima della compilazione, lo __LINE__ conterrà la riga effettiva del file in cui è stata utilizzata la macro. Inlining non influenzerà affatto questo comportamento.

3

__LINE__ sarà la riga del file di intestazione poiché il preprocessore la valuterà prima che il compilatore la vedrà mai.

Problemi correlati