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标准说,

当前定义为类对象宏的标识符不应由另一个#define 重新处理指令重新定义,除非第二个定义是类对象宏定义并且两个替换列表相同。同样,当前定义为类函数宏的标识符不应由另一个#define 预处理指令重新定义,除非第二个定义是具有相同数量和参数拼写的类函数宏定义,并且两个替换列表相同.

我认为编译器会提示重新定义 MACRO 的警告。因此这是不可能的。

于 2012-12-20T17:30:11.517 回答