1

同時にサポートするマクロ関数を定義したい:

1)入力パラメータなし

2)入力パラメータ

そんな感じ:

#define MACRO_TEST(X)\
    printf("this is a test\n");\
    printf("%d\n",x) // the last printf should not executed if there is no input parameter when calling the macro

概して:

int main()
{
    MACRO_TEST(); // This should display only the first printf in the macro
    MACRO_TEST(5); // This should display both printf in the macro
}
4

4 に答える 4

5

この目的でsizeofを使用できます。

次のようなことを考えてみてください。

#define MACRO_TEST(X) { \
  int args[] = {X}; \
  printf("this is a test\n");\
  if(sizeof(args) > 0) \
    printf("%d\n",*args); \
}
于 2012-12-20T17:23:45.240 に答える
1

gccおよび最近のバージョンのMSコンパイラは、可変個引数マクロ(printfと同様に機能するマクロ)をサポートしています。

gccのドキュメントはこちら:http: //gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html

Microsoftのドキュメントはこちら: http: //msdn.microsoft.com/en-us/library/ms177415 (v = vs.80).aspx

于 2012-12-20T17:26:18.767 に答える
1

正確にはそうではありませんが...

#include <stdio.h>

#define MTEST_
#define MTEST__(x) printf("%d\n",x)
#define MACRO_TEST(x)\
    printf("this is a test\n");\
    MTEST_##x    

int main(void)
{
    MACRO_TEST();
    MACRO_TEST(_(5));
    return 0;
}

編集

そして、0をスキップとして使用できる場合:

#include <stdio.h>

#define MACRO_TEST(x) \
    do { \
        printf("this is a test\n"); \
        if (x +0) printf("%d\n", x +0); \
    } while(0)

int main(void)
{
    MACRO_TEST();
    MACRO_TEST(5);
    return 0;
}
于 2012-12-20T21:57:46.030 に答える
0

C99規格によると、

オブジェクトのようなマクロとして現在定義されている識別子は、2番目の定義がオブジェクトのようなマクロ定義であり、2つの置換リストが同一でない限り、別の#define再処理ディレクティブによって再定義されないものとします。同様に、関数のようなマクロとして現在定義されている識別子は、2番目の定義が同じ数とパラメーターのスペルを持ち、2つの置換リストが同一である関数のようなマクロ定義でない限り、別の#define前処理ディレクティブによって再定義されないものとします。 。

コンパイラは、再定義されたMACROの警告を表示すると思います。したがって、それは不可能です。

于 2012-12-20T17:30:11.517 に答える