私のプログラムでエラーメッセージ/警告を出力する機能を、ファイル&の行番号と共に書きたいと思います。 Cにおけるこれら二つのマクロがあります。デバッグ出力機能をクリーンアップしますか?
__FILE__
__LINE__
は、私の意見では問題があります...私はこのような機能を書いているとき:
#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void error(const char *location, const char *msg)
{
#ifdef DEBUG
printf("Error at %s: %s\n", location, msg);
#endif
}
int main(int , char**)
{
error(AT, "fake error");
return 0;
}
がたくさん残っていますリリースビルドのためにDEBUG
を定義しなくても、役に立たない関数は&ゴミ箱(すべての呼び出しで__FILE__
と__LINE__
の値)をバイナリファイルに呼び出します。 これをよりうまく実現するにはどうすればよいですか? - そのようなタスクのためにあまりにも巨大になり
#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void error(const char *location, const char *msg)
{
printf("Error at %s: %s\n", location, msg);
}
int main(int , char**)
{
#ifdef DEBUG
error(AT, "fake error");
#endif
return 0;
}
しかし、すべての関数呼び出しの前と後#ifdef DEBUG
と#endif
を書いていない:私はこのような何かをしたいです。すべてのerror(AT, "fake error");
を手動で削除すると、実際にはエレガントではありません...
アイデア?多分インライン関数(助けにならない、そうでないだろう)?いくつかのマクロまたはこの構造の変更?
これがためのものですC99またはC++ 0xのみであり、 '#define eprintf(...)do {fprintf(stderr、"%s:%d: "、__FILE__、__LINE__); fprintf(stderr、__VA_ARGS__)} while(0) ';余分な引数なしで生の文字列を渡せる 'fprintf(stderr、__VA_ARGS __)'の 'do {...} while(0)'と(より重要な点)で囲まれた文に注意してください。 –
ya私は知っている、なぜ私はそれが上記のステートメントに似ている書いた。 – Rozuur
ちょうど試してみましたが、 '__VA_ARGS __)の後に'; 'がありませんでした。そうでなければ本当に素晴らしい解決策です! – lfxgroove