挙動

2012-06-26 11 views
13

私はエラーハンドラに行番号とファイル名を渡すマクロを持っている:挙動

#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、あなた自身のコンパイラでこれをテストし、あなたの質問に結果を含めることができます(これにより、 '私のプリプロセッサはこれを標準ですか?')。 –

答えて

20

CおよびC++では、マクロは実際のコードの知識がなくても評価され、コードの前で処理されます(したがって、名前 "プリプロセッサ")。したがって、__FILE__は "file.h"と評価され、__LINE__は、SYSTEM_FAILUREがfile.hに現れる行に対応する行番号に評価されます。

7

マクロはコンパイル前の定義に置き換えられるため、__LINE__にはマクロを使用したファイルの実際の行が含まれます。インライン展開はこの動作にまったく影響しません。

3

__LINE__は、ヘッダーファイルの行になります。これは、プリプロセッサがコンパイラに表示される前に評価するためです。