2
gcc 4.7.2
c89

こんにちは、

#define LOG_ERR(fmt, ...)                                               \
    fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n", __func__, __LINE__, strerror(errno), ##__VA_ARGS__)

そして、私はそれを次のように使用しています:

LOG_ERR("Failed to connect to message queue [ %d ]", msg_id);

fmtはfprintfステートメントで連結されています。これはどのように可能ですか?

コンセプトをテストするために、以下で同じことを試みましたが、コンパイルエラーで失敗しました:

/* Using char array */
const char name[] = "Joe";

printf("Hello how " name " how are you today?\n");

Using constant string literal
const char *name = "Joe";

printf("Hello how " name " how are you today?\n");

どちらも私に次のエラーをゲームします:

expected ')' before name

提案をありがとう、

4

5 に答える 5

6

フォーマット指定子が必要です。printfのドキュメントを確認してください。

const char *name = "Joe"; // or your char array, either's fine

printf("Hello how %s how are you today?\n", name);

あなたの試み:

printf("Hello how " name " how are you today?\n");

もう少しC++っぽく見えます

cout << "Hello how " << name << "are you today?\n";
于 2012-12-26T03:52:39.343 に答える
4

違いは、マクロがテキストで単語を文字列に置き換えていることfmtです。2つ以上のリテラル文字列を組み合わせると、それらの文字列を連結できます。

"Hello " "World" "!!"
/* is the same as */
"Hello World!!"

リテラル文字列のみがこれを行うことを忘れないでください。これは変数では機能しません。

マクロは、コード内の検索/置換のようなものと考えてください。説明のために、マクロの定義を考えてみましょう-

#define LOG_ERR(fmt, ...)  \
    fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n",
            __func__, __LINE__, strerror(errno), ##__VA_ARGS__)

このように使うと-

LOG_ERR("Failed to connect to message queue [ %d ]", msg_id);

テキストの置換を行い、-になります

fprintf(stderr, "[ERROR] %s:%d: error [%s] " "Failed to connect to message queue [ %d ]" "\n",
            __func__, __LINE__, strerror(errno), msg_id)

並んだ文字列と連結された出来上がり-

fprintf(stderr, "[ERROR] %s:%d: error [%s] Failed to connect to message queue [ %d ]\n",
            __func__, __LINE__, strerror(errno), msg_id)
于 2012-12-26T04:35:02.517 に答える
3

失敗した場合は、変数を使用しているためです。文字列リテラルはコンパイラによって連結できます。つまり、「abc」「123」と書くと、コンパイラはこれを「abc123」として扱います。そして、マクロでこれを行うと、プリプロセッサは、これがまさにコンパイラに送信されるものであることを意味します

LOG_ERR("Failed to connect to message queue [ %d ]", msg_id);

になります

fprintf(stderr, "[ERROR] %s:%d: error [%s] " "Failed to connect to message queue [ %d ]" "\n", myfunction, 123, strerror(errno), msg_id);

ストリンガーと連結マクロもチェックする価値があるかもしれません(プリプロセッサーの場合-#そして##私はどちらがどれであるかを覚えていません...)

Andrew

于 2012-12-26T03:53:11.000 に答える
1

マクロを定義したいfprintf()場合は、このようにすることができます。これは最も単純なIMHOです。

#define LOG_ERR(...)   fprintf(stderr, __VA_ARGS__)

のように使用します

int main()
{

    int  myVar =100;

    LOG_ERR ("The value of myVar is %d", myVar); 

    return 0; 
}
于 2012-12-26T04:23:50.880 に答える
0
#include <stdio.h>
#include <sys/time.h>
#include <string>

#define MyPrint(...) {\
struct timeval tv;\
gettimeofday(&tv,0);\
printf("%d.%d:", (unsigned int)tv.tv_sec, (unsigned int)tv.tv_usec);\
printf(__VA_ARGS__);}
于 2018-04-20T07:38:34.857 に答える