2
gcc (GCC) 4.7.2
c89

こんにちは、

私はテストスイートを見てきましたが、次のように宣言されたこの関数のようなマクロに気づきました。

#define MU_SUITE_START() char *msg = NULL

ただし、代わりにこれを行うことと実際の違いはありますか?

#define MU_SUITE_START char *msg = NULL

マクロはテキストの置換を行うだけなので、パフォーマンスの問題は発生しないと思います。

cppを使用すると、次の結果が得られるため、ここでは特別なことは何もありません。

関数のようなマクロ

char *msg = __null;

マルコ

char *msg = __null;

補足:入力パラメータで提供されない関数のようなmarcoを宣言する価値はありますか?ここでは、パラメータを渡していません。

#define PRINT_MSG() printf("This is the message\n")

入力パラメータがないのに、なぜ関数のようなマクロを気にするのですか?これは良いことではありませんか?

#define PRINT_MSG printf("This is the message\n")

提案をありがとう、

4

1 に答える 1

5

オブジェクトのようなマクロと関数のようなマクロには1つの違いがあります。

#define OBJECT     char *msg1 = NULL
#define FUNCTION() char *msg2 = NULL

void somefunc(void)
{
    int OBJECT = 5;
    int FUNCTION = 10;
    ...
}

の宣言OBJECTはマクロに置き換えられます(したがって、コードはコンパイルされません)が、FUNCTIONへの参照は、開き括弧が後に続かないため、マクロ呼び出しではありません。

これはめったに重要ではありません。しかし、そうであれば、それは本当に重要です。

より一般的なケースは、マクロとして実装できる関数です。議論のために(良い例ではなく、簡単に理解できるため):

extern int isdigit(int c);
#define isdigit(c) ((c) >= '0' && (c) <= '9')

および実装ファイル内:

int (isdigit)(int c)
{
    assert((c >= 0 && c <= UCHAR_MAX) || c == EOF);
    return isdigit(c);
}

そのような小さな詳細を無視isdigit()することは、実装される可能性が高い方法ではなく、のマクロ実装はisdigit()その引数を複数回評価することはできません。また、標準Cライブラリにあるものを再定義することは想定されていません。名前の後に。がisdigit続かないため、定義はマクロ展開されません(が、関数内のマクロは展開されます。少なくとも関数はマクロの観点から実装されており、ほぼ同じ動作を保証します。

于 2012-12-14T03:52:36.433 に答える