我在我的项目中使用了很多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)类型是什么意思?
答案 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
没有黑魔法。