2017-11-16 5 views
6

現在のテストフレームワークでは、最初に関数()をその関数内のフラグメントの行番号に渡す必要があります。このような何か: 他の関数の__LINE__の値を取得する方法(その関数を呼び出す前に)?

#include <stdio.h> 
void func(int line_num) 
{ 
#define LINE_NUM (__LINE__ + 1) 
    if(line_num == __LINE__) // Check the passed arg against the current line. 
    printf("OK"); 
    else 
    printf("FAIL"); 
} 

int main(void) 
{ 
    func(LINE_NUM); // Pass to the func the line number inside of that func. 
    return 0; 
} 

(これは、より複雑な機能の最小限のバージョンです)。

サンプルコードと同様に、「FAIL」と表示されます。

私が絶対値5を渡すと、 func(5) "OK"と表示されます。絶対値5が好きではありません。なぜなら、func定義の前にもう1行追加すると、絶対値に修正が必要になるからです。

1.

#define VALUE_OF(x) x 
#define LINE_NUM (VALUE_OF(__LINE__) + 1) 

2.

#define VAL(a,x) a##x 
#define LOG_LINE() (VAL(/*Nothing*/,__LINE__) + 1) 

3.

#define VALUE_OF2(x) x 
#define VALUE_OF(x)  VALUE_OF2(x) 
#define LINE_NUM (VALUE_OF(__LINE__) + 1) 

私が使用している:その代わり#define LINE_NUM (__LINE__ + 1)

は、私はまた、次のことを試してみました

私のサンプルコードでは、func()の値は14(コールサイトの行番号+1)です。

+1

ので、年の小さなサンプル中LINE_NUMの値は何ですか? – pm100

+0

'#define'を関数の外に移動してください – smac89

+0

@ pm100私の質問に「func()の値は14」という値を追加しました。 @ smac89 '#define'を動かすことで問題は解決します。サンプルコードで質問に答えることができますか? –

答えて

5

マクロ定義で__LINE__を展開するプリプロセッサを取得することはできません。それはプリプロセッサが動作する方法ではありません。

しかし、グローバル定数を作成することはできます。

#include <stdio.h> 

static const int func_line_num = __LINE__ + 3; 
void func(int line_num) 
{ 
    if(line_num == __LINE__) // Check the passed arg against the current line. 
    printf("OK"); 
    else 
    printf("FAIL"); 
} 

int main(void) 
{ 
    func(func_line_num); // Pass to the func the line number inside of that func. 
    return 0; 
} 

あなたが列挙型を使用することができ、どんな理由であれ、static const intが気に入らない場合:

残念ながら
enum { FUNC_LINE_NUM = __LINE__ + 3 }; 

、あなたはグローバル定数や列挙型を使用するかどうか、あなたが定義を配置する必要がありますファイルスコープでは、使用ポイントから多少離れている可能性があります。試験の正確な行数が(例えば)関数の最初の行または一意であることが保証も任意の整数を使用する必要はなく、なぜしかし、それはすぐに明らかではない:

#include <stdio.h> 

// As long as all uses of __LINE__ are on different lines, the 
// resulting values will be different, at least within this file. 
enum { FUNC_LINE_NUM = __LINE__ }; 

void func(int line_num) 
{ 
    if(line_num == FILE_LINE_NUM) // Check the passed arg against the appropriate constant. 
    printf("OK"); 
    else 
    printf("FAIL"); 
} 

int main(void) 
{ 
    func(func_line_num); // Pass to the func the line number inside of that func. 
    return 0; 
} 
+0

ありがとうございます。それはまさに私が最終的に思いついた解決策でした。しかし、もっと良い解決策があることを期待していました。 それでは、より良い解決策があります。 –

+0

@RobinKuzmin:好奇心のために、「より良い」というあなたの基準は何ですか? – rici

+0

私にとっては、 '(__LINE__ + 3)'ではなく、 ''(__LINE__ + 1) ''を意味しています。なぜなら、' __LINE__ + 3'と'if(line_num == __LINE __)'なら '3'は修正が必要です。また、実行時にスペースを占有するvar(たとえ誰かが間違ってそのvarのアドレスを取得した場合など、 '=&func_line_num')もあります。 –

0

後@私は必要なものにRICIさんanswer and comments偉大最も近いものは次のとおりです:

#include <stdio.h> 

#define LINE_NUM_TESTER() \ 
    enum { LINE_NUM = __LINE__ }; \ 
    \ 
    void line_num_tester(int line_num) \ 
    { \ 
     if(line_num == __LINE__) \ 
     printf("OK\n"); \ 
     else \ 
     printf("FAIL. line_num: %d, __LINE__: %d.\n", line_num, __LINE__); \ 
    } 

LINE_NUM_TESTER() 

int main(void) 
{ 
    line_num_tester(LINE_NUM); 
    return 0; 
} 
関連する問題