__LINE__でコード行を取得する

私は現在のコードの行番号を次のように使って表示しようとしました:

#include 

void err (char *msg)
{
    printf ("%s : %d" , msg , __LINE__);
}

int main ( int argc , char **argv )
{
    ERR ("fail..");
    return 0;
}

しかし、私はいつも間違った行番号を取得しますが、 5 ではなく 10 でなければなりません。

また、私はいくつかのマクロを使用しようとしました:

#define ERR(msg)do {printf( "%s:%d \ n"、msg、__LINE__); } while(0)

and result in error: msg not declared

4
@ hochl、いいえ、それは、この場合、10と呼ばれる場所にする必要があります
追加された 著者 daisy,
5 は正しい答えですか?いいえ、 5 は5行目です。
追加された 著者 hochl,
うん、それを考え出し、下に例を掲載しました^^
追加された 著者 hochl,
あなたの元のERRマクロがうまくいかなかった理由は、「ERR」と「(msg)」の間のスペースのためです。
追加された 著者 proc-self-maps,

4 答え

__LINE__ will give you the line on which it appears, which is always line 5.

これを行うには、別のパラメータとして __ LINE __ を渡す必要があります。

#include 

void err (char *msg, int line)
{
    printf ("%s : %d" , msg , line);
}

int main ( int argc , char **argv )
{
    err("fail..", __LINE__);
    return 0;
}

これを行うさらに良い方法は、そのようなメソッドの呼び出しをマクロとして定義することです:

#define PRINTERR(msg) err((msg), __LINE__)
10
追加された
#define ERR(msg) printf("%s : %d", (msg), __LINE__)

トリックをする必要があります。

あなたはその機能を必要としません!

8
追加された
これはマクロの問題です。一度プログラムの小さな味を加えてしまえば、すべてを感染させ始める。
追加された 著者 T.E.D.,
@ JohnDibling - 右ですが、 __ LINE __ がマクロであるためです。その使用法を一般化しようとすると、より多くのマクロを使用する必要があります。それらのマクロ "ルーチン"の使用を一般化したい場合は、 more マクロが必要です。したがって、 __ LINE __ マクロを使用すると、プログラム全体がマクロでゆっくりと感染します。
追加された 著者 T.E.D.,
たぶん、この特別な作業はマクロなしでは達成できません。
追加された 著者 John Dibling,
@ T.E.D .:私はあなたの意見を聞くのか分からない。 などのデバイスを使用するファイル名と行番号を使ってロギングを実装しても、コードにはマクロで "感染"しません。それは、必要なところで仕事に最適なツールを使用するだけです。それはいいことではないですか?
追加された 著者 John Dibling,
おっと、オススメです。 BTW - if の後ろに中かっこで入れる必要があります。人々が動作することを期待して余分なコード行を追加すると、多くの悲しみが救われます。
追加された 著者 Ed Heal,
マクロの中にセミコロンを入れないでください。そうしないと、 if/else の条件に置いたときに問題が発生します。
追加された 著者 Jens Gustedt,

__LINE__ gets the current line, meaning the line that it was called on. You need to pass it as a parameter:

ERR ("fail..", __LINE__);

それ以外の場合、エラー関数内の行は、 5 のようになります。 __ LINE __ マクロの int 型を受け入れるように関数を変更してください。

@Ed Healが答えたマクロを使用します。また、マクロ内の変数を括弧で囲む必要がある((msg))という理由で、 "msg not declared"マクロの名前、およびパラメータリストを開始する括弧。

6
追加された
ERR(msg)printf( "%s:%d \ n"、 ERR と '(msg)'の間にスペースを入れていると思います。 msg、__LINE __)
追加された 著者 daisy,
@onemasse、それは良い点です
追加された 著者 daisy,
いいえ、カッコでパラメータを囲む必要はありません。マクロ置換は単なるテキスト置換です。
追加された 著者 Jens Gustedt,
msgは式であるため、msgを囲むことは良い考えです。この場合は必要かどうかはわかりませんが、それは大雑把なルールです。
追加された 著者 onemasse,

ERR をマクロにすることができます:

#define ERR(msg) fprintf(stderr, "ERROR on line %d: %s\n", __LINE__, (msg))
0
追加された
fprintf には最初のパラメータとして FILE * が必要です
追加された 著者 Jens Gustedt,
うん。
追加された 著者 hochl,