预处理和宏函数

1. 预设常量

#include <stdio.h>
//#define THE_NUM 2

main()
{
printf("The num is %d\n",THE_NUM);
}

gcc a.c -DTHE_NUM=2

2. 条件预处理

#include <stdio.h>
#define WIN 1
#define LINUX 2
#define MAC 3
void sayHello()
{
#if PLATFORM==WIN
printf("Hello Windows\n");
#elif PLATFORM==LINUX
printf("Hello Linxu\n");
#elif PLATFORM==MAC
printf("Hello Mac\n");
#else
printf("Unknow platform\n");
#endif
}
main()
{
sayHello();

}

gcc a.c -DPLATFORM=1

Hello Windows.

3. 防止头文件重复引入

include.c  a.h a.c b.h b.c

#pragma once //等于下面的注释的内容
/* #ifndef B_H_ */
/* #define B_H_ */
#include "a.h"
void funcB();
void funcB1();
void funcB2();

/* #endif */

时间: 2024-11-03 21:52:18

预处理和宏函数的相关文章

IOS学习之路-- 指针&amp;宏函数

如果*p被()包住,说明指针变量p将来指向的是函数 //声明一个指针变量 //int (*p)(int, int) = sum; int (*p)(int, int); p = sum; // 如果*p被()包住,说明指针变量p将来指向的是函数 // 最左边的void说明p指向的函数没有返回值 // 最右边的()说明p指向的函数没有形参 void (*p)(); // 函数名test就是test函数的地址 // 将test函数的地址赋值给了指针变量p // 指针变量p成功指向了test函数 p

关于宏函数的定义

以前一直以为宏的定义挺简单的,没有写过长的宏函数,最常用的是MAX()的定义,今天写一个宏函数的时候,相对于MAX()来说,稍微有点长,然后踩了一个小坑. 一开始将宏函数定义的时候,为了书写方便,将一个函数写成了几行,但是没有用连接符号连接起来,类似于下面 1 #define CHECK(ret) ({ 2 int ret; 3 ... 4 }) GCC总是提示ret不在范围内.想了半天没有明白怎么回事. 然后我发现了一个问题. 我的VIM定义宏函数时,#define那一行是显示的蓝色,但是我的

宏函数定义继承类

//: ORDER.CPP -- Order of constructor calls // with inheritance #include <iostream.h> #define inherit(derived, base) class derived : public base { public: derived() { cout << #derived << endl; } }; class X {}; inherit(A, X) inherit(B, A)

C语言宏函数参数的连接

#include<stdio.h> #define Calculate_Max(A,B) A>B?A:B #define Calculate_Min(A,B) A<B?A:B #define Calculate(A,B,NAME) Calculate_##NAME(A,B) int main(void) {         printf("%d\n",Calculate(5,8,Max));         return 0; } 使用宏函数或者宏函数时,注意如

1013-----C语言----------几个va_宏函数的使用

最近在看APUE附带的源码时,看到它的错误处理文件中用到了可变参数列表(如下),正好最近老是看到这几个函数在眼前晃悠,所以就做个了断吧.哈哈. #include "apue.h" #include <errno.h> /* for definition of errno */ #include <stdarg.h> /* ISO C variable aruments */ static void err_doit(int, int, const char *,

FrameWork模型中引入宏函数报错解决方法

如下图在Framework的一个简单维度中加入宏函数 解决办法如下图 step1: step2: PS :Cognos 10.1.1中 在cognos connection中创建数据源,为什么没有odbc的选项,只有一种查询方式

【转】linux内核中writesb(), writesw(), writesl() 宏函数

writesb(), writesw(), writesl() 宏函数 功能 : writesb()    I/O 上写入 8 位数据流数据 (1字节) writesw()   I/O  上写入 16 位流数据 (2字节) writesl()    I/O 上写入 32 位流数据 ( 4字节 ) 原型 : 引用 #include <asm/io.h> void   writesb (unsigned short ioaddr , void * addr , unsigned long coun

宏函数的写法

宏函数有执行较快,但占用代码长度较大,且不易调试的特点 对于运算型的宏函数,可以写成 #define f(a,b) ((a)+(b)) 宏函数中所有的参数都应该加小括号保证a,b先运算完毕,宏函数的最外面应该再加一层小括号保证宏函数整体运算 对于复杂的,需要调用其他函数的宏函数,则应该使用大括号把他们包在一起,避免如if之类的语句,只执行到第一句. #define F(a,b) { \ f(a); g(b); } 其中反斜线是为了满足宏函数定义在一行内的要求. 但这边又出现另外一个问题,对于一些

C语言_宏函数存在的问题

C语言中的宏函数可以简化我们的操作. 但是存在一定的问题,宏函数是不能使用++a/a++,--a/a--这种形式的.这样会导致BUG(所得到的结果与预想结果不一致). 原因就是宏函数是进行的文本拷贝,而不是传递的参数. 示例代码如下: #include <iostream> using namespace std; #define SQUARE(X) ((X)*(X)) inline int fabs(int i); inline double square(double); int main