具有括号结构的宏

时间:2014-05-20 07:28:53

标签: c macros struct

我刚刚在某处找到了代码:

#include"stdio.h"

typedef struct st
{
  int num;
  char c;
  int abc;
} Str, *pStr;

#define MyStr(Dcn) Str(Dcn)

int main()
{
  Str Str1;
  MyStr(Dcn);
  return 0;
}

请告诉#define这里的含义是什么?因为它没有给出任何编译问题。因此,如果我将#define某些内容用于“带括号的结构”,那么会发生什么?

此处Dcn可以是任何不带引号的内容。当我使用数字而不是它显示编译错误。

2 个答案:

答案 0 :(得分:4)

这定义了Str的别名。它相当于

int main()
{
    Str Str1;
    Str(Dcn);
    return 0;
}

其中只是声明Dcn类型的变量Str

答案 1 :(得分:0)

它是一个类似函数的宏,它被扩展到右侧,并且替换了参数。

一个经典的例子就是计算最多两个值:

#define MAX(a, b)    ((a) > (b) ? a : b)

你可以像这样使用它:

int hello = 12, there = 47;
int what = MAX(hello, there);

第二行将扩展为:

int what = ((12) > (47) ? 12 : 47);

换句话说,what将是47。请注意,此宏会多次评估其参数,如果存在副作用,这可能会有害。

从C99开始,您也可以variadic preprocessor macros

您显示的代码将扩展为:

Str Str1;
Str(Dcn);  /* This is the macro-expansion. */