0

ああ

#define print_line(fmt,...) do{\
    struct timespec _t; clock_gettime(CLOCK_MONOTONIC, &_t);\
    printf("%ld.%ld %s:%d: " fmt "\n", _t.tv_sec + _t.tv_nsec / 1000000, __func__, __LINE__, ##__VA_ARGS__);\
}while(0)

交流

struct timespec timeval;

print_line(timeval)

エラーが発生しました:error: expected ')' before .

4

2 に答える 2

1

"..." fmt "..."表示されるは、が文字列リテラル()の#define場合にのみ有効です。fmt"..."

私はあなたが次の線に沿ってもっと何かを望んでいると思います:

 #define print_line(fmt,...) do{\
    char str[100]; \
    sprintf(str, "%%ld.%%ld %%s:%%d: %s\n", fmt);\
    printf(str, 1.0 / 1000000, __func__, __LINE__, ##__VA_ARGS__);\
}while(0)

テスト:

char *i = "hello%s";
print_line(i, "abc");

別のこと-Cはstruct timespec文字列に変換する方法を知らないので、次のようなことをする必要があります:( timespecがnullで終了するchar配列以外で始まる場合、それは機能しません)

struct timespec
{
   char abc[100];
};
struct timespec ts;
sprintf(ts.abc, "hello%%s"); // for testing
print_line(&ts, "abc");

もう1つ、「%ld。%ld」はゴミを印刷しているように見えますが、その理由はよくわかりません。代わりに「%f」が必要かもしれません。

于 2013-01-24T09:08:19.393 に答える
0

秒とミリ秒単位の時間、ソースコードの場所、およびオプションのコメントとともに、使用しようとしている変数の名前を出力するだけのデバッグツールが必要だと思いました。

#define print_line(fmt,...) do{\
    struct timespec _t; clock_gettime(CLOCK_MONOTONIC, &_t);\
    printf("%ld s %ld ms %s:%d: %s" " fmt " "\n", _t.tv_sec , _t.tv_nsec / 1000000, __func__, __LINE__, ##__VA_ARGS__);\
}while(0)

使用する:

 struct timespec timeval;
 print_line(timeval) ;
于 2013-01-24T08:30:25.197 に答える