您的位置:首页 > 编程语言

宏定义,条件预编译,多文件编程

2014-03-20 01:02 253 查看
宏定义的用法:

#include<stdio.h>
#define PI 3.14
#define CH(x)  x<='Z'&&x>='A'?tolower(x):toupper(x)
#define C(x)     #x
#define INTV(n)   i_##n
int main()
{
int num = 2;
printf("%lf\n",num * num * PI);
char ch = 'A';
printf("%c\n",CH(ch));
printf("hello "C(world)"\n");
int INTV(num) = 20;
printf("%d\n",INTV(num));
i_num = 200;
printf("%d\n",i_num);
return 0;
}
贴一张经过编译预处理的图

若文件名是test.c 则就可以用gcc -E test.c 对文件名进行预编译



条件预编译是指对.c 源文件进行选择性编译  主要是用来判断是否定义了宏

例如

#include <stdio.h>
int main()
{
#ifdef ONE
printf("1\n");
#else
printf("2\n");
#endif

return 0;
}


gcc -E -DONE case.c     //-E编译预处理 -DONE 定义ONE的宏

显示如图



用gcc -E test.c 来编译预处理test.c文件

得出的是



如图所示 都未定义宏则会输出100%

其中逻辑表达式需要在预处理阶段就能计算出来结果。例如在#if中声明变量分配空间就不对了

下面就是多文件编程

例如

文件一

int add(int a,int b){   // add.cpp
return a+b;
}
文件二
#include<stdio.h>  //main.cpp
int main(){ printf("%d",add(1,2)); return 0}



gcc main.c add.c

这样编译是可以的,但是有可能出项隐式函数声明的问题 即调用add(2.3,3.5)会出现错误结果

可以加上头文件的调用

例如数组求和

add.h

extern int sum;
void  add(int*,int);


add.c

#include "add.h"
int sum = 0;   //注意若定义全局变量,main函数要在调用就需要在add.h中声明extern 关键字
void  add(int *p,int size){
int i = 0;
for (i = 0;i < size ;i++){
sum += *(p + i);
}
}


main.c

#include<stdio.h>
#include"add.h"
int main()
{
int a[10]={2,4,3,5,6,7,1};
int size = 7;
add(a,size);
printf("%d\n",sum);
return 0;
}


gcc main.c add.c  就可以了。

注意可能存在重复包含头文件的时候。

这样就要采用

#ifndef __add_h   //最好和定义的头文件名类似
#define __add_h
#include "add.h"
#endif
来避免头文件被重复包含
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐