2012-01-16 8 views
9

info()、debug()、error()関数を含むlog.cファイルを作成したい。 これらの機能は、ファイル名、行番号、等を印刷せずに機能しています。 私はこの関数の1つを呼び出すときに、呼び出し元のファイル名、行番号、関数名をダンプします。それでは、どうやって正確に追跡しますか? Cをトレースバックする方法はありますか、またはマクロを使用する場合、これをどのように行うことができますか?呼び出し関数のファイル名、行番号、関数名を出力する - C Prog

+0

http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm

+1

[C/C++行番号] (http://stackoverflow.com/questions/2849832/cc-line-number) – user7116

+0

@KennyTM:ありがとう!答えはそこにある。 – sura2k

答えて

21

は私が

int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 

を(多分マクロの助けを得る)、それらを呼び出すためのパラメータによって関数にデータを渡したい

info(__FILE__, __LINE__, __func__, ...); 
debug(__FILE__, __LINE__, __func__, ...); 
error(__FILE__, __LINE__, __func__, ...); 

注:__func__がC99です。 gcc、モードC89で__FUNCTION__

+0

__FILE __などのパラメータを常に渡すことなく、これらの種類の関数を作成する方法はありますか? – sura2k

+8

はい、マクロ付きです。例えば、C99(可変マクロを持っている)の場合:#define INFO(...)info(__ FILE__、__LINE__、__func__、__VA_ARGS __) ' – pmg

+0

ありがとう!それが私の必要なものです。 – sura2k

5

マクロを使用する場合は、__FILE__,__LINE__、および__FUNCTION__を使用してこの作業を行うことができます。例えば、

#define INFO(msg) \ 
    fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \ 
    fprintf(stderr, "%s", msg); 

は、あなたも関数を使用することもできますが、あなたは彼らが正しい値を持っていたことを確認する__FILE__などに合格する必要があります。

+1

'gcc -std = gnu99'は' __LINE__'は整数で、 'char *'にキャストすることを警告します。 2番目の行は 'fprintf(stderr、info:%s:%d:"、__FILE__、__LINE__)でなければなりません。 \ '('%s'は '%d'で置き換えられますか? – matec

+0

修正済み!そこに古い学校のPythonがあります。 – Michael

関連する問題