c - 变量 C 宏函数

标签 c macros c-preprocessor

这个宏中发生了什么?我知道 #test 将此参数扩展为文字文本。但是 pre;test; 是做什么的呢?

#define MACRO_FN(test, pre, repeat, size)    \
  do {                                     \
    printf("%s: ", #test);                 \
    for (int i = 0; i < repeat; i++) {     \
      pre;                                 \
      test;                                \
    }                                      \
  } while (0)

这个是这样用的

MACRO_FN(a_func(an_array, size),, var1, size);

这里的双逗号是什么意思?

最佳答案

这是一个最小的例子:

#define repeat 5    // I added this, because 'repeat' is not mentionned in your question

#define MACRO_FN(test, pre, var1, size)    \
  do {                                     \
    printf("%s: ", #test);                 \
    for (int i = 0; i < repeat; i++) {     \
      pre;                                 \
      test;                                \
    }                                      \
  } while (0)

void foo()
{
}

void func(int a, int b)
{
}

int main()
{
  MACRO_FN(func(2, 3), foo(), var1, size);
}

预处理后,代码等同于:

int main()
{
  printf("%s: ", "func(2,3)");
  for (int i = 0; i < 5; i++)
  {
    foo();
    func(2, 3);
  }
}

所以这个宏是一个包装器,它打印函数名称加上它的参数,因为它被宏调用并执行第一个参数中指定的函数 repeat 次(无论 repeat是)。如果省略第二个参数,则具有该名称的函数很简单,不会在前面提到的函数之前调用,如下例所示:

int main()
{
  MACRO_FN(func(2, 3),, var1, size);
}

预处理后,代码等同于:

int main()
{
  printf("%s: ", "func(2,3)");
  for (int i = 0; i < 5; i++)
  {
    ;
    func(2, 3);
  }
}

注意:

为简洁起见,我从等效程序中删除了do while(0),阅读this SO article了解更多信息:

关于c - 变量 C 宏函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374784/

相关文章:

c - 动态分配的结构体指针数组

ios - 如何在 Objective-C 宏中编写多条指令?

混淆 MACRO 和枚举定义

python - C和Python之间的套接字通信

java - JNI : transfer a multiple-dimension java array to c program

C Socket,在数据流之前添加 header

c# - 如何在 VS 宏中检索标识符的完全限定名称?

c++ - 在编写类似的 CUDA 内核时,如何不在没有宏的情况下重复自己?

c - 这个映射到 C 关键字的 C 预处理器宏有什么用?

c - 显然 NULL 在包含的文件中是未知的