吞噬巨兽:宏总结

来源:百度文库 编辑:中财网 时间:2024/04/29 17:16:38
1 条件include
如下
CODE
#ifndef MAIN_H_
#define MAIN_H_

其它内容

#endif
上面在看到头文件时会看到 作用就是阻止这个头文件被多次include
多次include就会出现重复的定义情况 所以需要在每个头文件中都使用这个定义

如果还不是很了解要怎样使用 可以看看 c的标准头文件 如fcntl.h

2 条件编译

如下
CODE
#ifdef _DEBUG
printf("this debug info\n");
#endif
如果没有定义_DEBUG宏的话 那么上面那一行是不会编译进去的
但是定义了_DEBUG后 上面那行就会编译进去 可以写个简单的程序测试
CODE
#include
int main()
{
#ifdef _DEBUG
printf("hello world\n");
#else
printf("no debug");
#endif
return 0;
}

第一次使用 gcc -D_DEBUG main.c
第二次使用 gcc main.c

运行两次的结果看
3 定义为某个值 以便后面修改这个值时不用修改其它地方代码 只要修改这个宏的定义就可以了

如一个软件的多语言版本等

如下

CODE
#include
#define PRINT_STR "你好 DD"
main(){
printf(PRINT_STR);
return 0;
}

编译时 会把PRINT_STR代替成"你好 DD"

以后想修改时就方便了


另外也可以定义为函数
#include

#ifdef _DEBUG
#define A(x) a(x)
#else
#define A(x) b(x)
#endif

int a(int x)
{
return x+1;
}

int b(int x){
return x+100;
}

int main(){
printf ("A(10) value is %d",A(10));
return 0;
}
[/code]

其实也可以定义成
#define A a


但是 定义成A(x)后 只有A后面带一个(x)类型的 编译器才会执行替换 比较安全 可以保证只替换函数而不替换变量

第四个
可变参数宏

有些时候定义一个宏来代替某个函数 但是这个函数是可变参数的话 那就需要考虑办法了

定义方法如下
CODE
#define PRINT(...) printf(__VA_ARGS__)
#include
int main(){
PRINT("%d %s %s",1,"吃饭了吗 smile MM:)","\n");
return 0;
}
第五个 宏组合

也就是## 和 #的用法
## 是连接符号 连接两个宏
#是把名字代替成字符串

如下
CODE
#define s5(a) supper_ ## a
#include
void supper_printf(const char* p )
{
printf("this is supper printf:\n%s\n",a);
}

int main()
{
s5(printf)("hello owrld");
return 0;
}

#用法如下
#include
#define s(p) #p
int main(){
printf(s(p)"\n");
return 0;
}

运行一下就知道了