2

Cで関数の代わりにマクロを書く必要があります

機能は次のとおりです。

void FSTATUS(int stat,char msg[])
{
    if(stat != 0)
    {
        EMH_ask_error_text(stat, &msg);
        printf("Error : \"%d\",\"%s\"\n",stat,msg);
    }
    else 
        printf("\n -------- %s -------- \n",msg);
}

マクロでifステートメントを使用する方法の例が非常に少ないため、これをマクロに変換する方法を理解できないこの部分で立ち往生しています。誰でも上記のコードで私を助けてくれませんか。

解決 :

マクロの代わりにインライン関数を使用しました

4

3 に答える 3

6
#define FSTATUS(stat, msg) do \
{ \
    if((stat) != 0) \
    { \
        EMH_ask_error_text(stat, &(msg)); \
        printf("Error : \"%d\",\"%s\"\n",stat,msg); \
    } \
    else  \
        printf("\n -------- %s -------- \n",msg); \
} while (0)

/do { ... } while (0)の間でこれが正しく機能することを確認するために を使用することに注意してください。ifelse

statorが式である場合の問題を回避するために、いくつかの場所で追加の括弧を使用することにも注意してくださいmsg

もちろん、マクロのすべての落とし穴に十分注意してください。よほどの理由がない限り、このタイプの関数マクロを実際に使用しないでください。理想的には、パフォーマンスが本当に重要な場合はインライン関数を使用する必要があります。それ以外の場合は、通常の関数をそのまま使用してください。

于 2013-08-23T09:47:13.750 に答える
4

適切なフォーマットは大きな違いを生むと私は信じています。だから私はいつも を揃えています\

#define FSTATUS(stat, msg)                                \
do                                                        \
{                                                         \
    if ((stat) != 0)                                      \
    {                                                     \
        EMH_ask_error_text((stat), &(msg));               \
        printf("Error : \"%d\",\"%s\"\n", (stat), (msg)); \
    }                                                     \
    else                                                  \ 
    {                                                     \
        printf("\n -------- %s -------- \n", (msg));      \
    }                                                     \
}                                                         \
while (0)

\重要:行末の後ろに空白がないことを確認してください。空白は改行を「中断」します。

もちろん、次のこともできます。

#define FSTATUS(s, m) ((s) ? (EMH_ask_error_text((s), &(m)), printf("Error : \"%d\",\"%s\"\n", (s), (m))) : printf("\n -------- %s -------- \n", (m)))

ここでは、コンマ演算子がif-block 内の 2 つのステートメント間の区切りとして使用されています。

于 2013-08-23T09:46:58.737 に答える
1
#define FSTATUS(stat,msg) \
do {                       \
    if(stat != 0)           \
    {                        \
        EMH_ask_error_text(stat, &msg);  \
        printf("Error : \"%d\",\"%s\"\n",stat,msg); \
    }  \                     \
    else \
        printf("\n -------- %s -------- \n",msg);\
}while(0)

関数タイプをマクロに変更するだけです。do {.. } while(0) を追加する必要がある理由がわからない場合は、これを参照できます

于 2013-08-23T09:48:47.800 に答える