理解C中的MACRO

时间:2015-05-18 06:07:24

标签: c

我在我的项目中使用了很多MACRO。但最近我看到了一个我无法理解的宏。

#include "stdio.h"

  #define   ELV_CODE        
 #define    MAN_CODE        
 #define    CHANGE_DAT      
 #define    DAT_MAN_CODE    

 #define MY_FUN(type, memclass) memclass type

typedef unsigned char uint8;
typedef uint8 ReturnType;

MY_FUN(ReturnType, CHANGE_DAT) Occ_Fun(unsigned int MyEvent)
{
    uint8 Return_Val = 1;
     printf("Hello World\n");
     return Return_Val;
}

int main()
{
  char str[20];

  strcpy(str, "Hello, Word!");
  Occ_Fun((unsigned int)16);
  return 0;
}

在上面的代码中,MY_FUN有一个MACRO。 MACRO应该是

  

MY_FUN(type,memclass)memclass

  

MY_FUN(type,memclass)类型

但#define的MY_FUN(类型,memclass)类型是什么意思?

2 个答案:

答案 0 :(得分:4)

您只需记住有简单宏和类似函数的宏。前者类似于:

#define TWIPS_PER_INCH 1440

而后者的形式如下:

#define THREE_X_PLUS_Y(x,y) (x) * 3 + (y)

并涉及将“参数”传递给要在正文中使用的宏,以便您的代码:

int z = THREE_X_PLUS_Y (10, var2);

变为:

int z = 10 * 3 + var2;

根据你的宏定义,这个:

#define CHANGE_DAT
#define MY_FUN(type, memclass) memclass type
MY_FUN(ReturnType, CHANGE_DAT) Occ_Fun(unsigned int MyEvent)

将转变为:

ReturnType Occ_Fun(unsigned int MyEvent)

(因为CHANGE_DAT是一个空的简单宏。)

这种技巧在used_by_all.h

这样的标题中使用
EXTERN int xyzzy;

其中EXTERN在您要定义变量的代码中定义为无(或未定义):它变为:

int xyzzy;

在你只想声明变量的代码中(声明它存在但实际上没有创建它),你要确保你有:

#define EXTERN extern

包含头文件之前。这意味着所有那些翻译单元(C源文件)将具有以下行:

extern int xyzzy;

在他们中间。

答案 1 :(得分:1)

带有参数的宏将在宏扩展期间使用此参数,这基本上是一个简单的文本替换:

#define MY_FUN(type, memclass) memclass type

将简单地用其参数替换宏:

My_FUN(first, second)

将扩展到

second first
没有黑魔法。