宏、条件编译、编译多文件程序
2016-01-15 16:57
190 查看
宏:
#define 预处理指令用来定义宏
#include <stdio.h>
#define PI 3.14f
int main()
{
int radius =10;
printf("请输入半径:");
scanf("%d",&radius);
printf("周长=%f\n",2*PI*radius);
return 0;
}
在编译命令里使用-D选项指定宏所代表的内容
#include <stdio.h>
int main()
{
int radius = 13;
printf("请输入半径:");
scanf("%d",&radius);
printf("周长=%f\n",2*PI*radius);
return 0;
}
gcc -DPI=3.14f m.c
宏不可以使用自己的存储区实现和函数之间的数据传递,宏没有形式参数和返回值
因为宏没有返回值,所有能当作数字使用的宏,必须写在一对小括号里面,才能保证优先计算内部的操作符
不能把自增或自减的计算 结果作为宏的参数使用
#define SUB(x,y) ((x-y))
#是一个宏操作符,它可以把宏的一个参数转换成字符串字面值
#include <stdio.h>
#define STR(n) #n
int main() {
STR(2+3);
return 0;
}
##也是一个宏操作符,它可以把一个代表标识符的参数和其它内容连接形成一个新的操作符
#include <stdio.h>
#define STR(n) #n
#define LOCAL(n) l_##n
int main() {
int num=0;
int LOCAL(num)=0;//int l_num = 0;
STR(2+3);//"2+3"
return 0;
}
条件编译:
#ifdef........#else......#endif
#include <stdio.h>
int main()
{
int order = 0;
printf("请输入一个数字:");
scanf("%d", &order);
#ifdef ZHAOBENSHAN
if(order ==1)
printf("没有\n");
else
printf("真没有\n");
#else
if(order==1)
printf("有\n");
else
printf("没有\n");
#endif
return 0;
}
gcc -DZHAOBENSHAN m.c
多文件编程基本步骤:
1. 把所有函数分散在不同的源文件里(通常主函数单独占一个字节)
2. 为每个源文件编写配对的以.h作为扩展名的头文件
3. 在每个源文件里使用#include预处理命令,包含必要的头文件
例子1:
main.c add.h add.c
vi main.c
#include <stdio.h>
#include "add.h"
int main()
{
int num=add(2,7);
printf("num=%d\n",num);
return 0;
}
vi add.h
int add(int,int);
vi add.c
#include "add.h"
int add(int num,int num1)
{
return num+num1;
}
例子2:
vi main.c
#include <stdio.h>
#include "read.h"
int main()
{
int num=fun();
printf("num=%d\n",num);
}
vi read.h
#ifndef _FUN_H_
#define _FUN_H_
int fun(void);
#endif
vi read.c
#include <stdio.h>
#include "read.h"
int fun(void)
{
int num=0;
printf("请输入一个数字:");
scanf("%d",&num);
return num;
}
gcc main.c read.c
Makefile实现文件程序的编译
Makefile文件中记录整个编译过程,make工具按照Makefile中记录的过程完成编译
Makefile文件中每个编译命令前都应该写tab键而不是空格
头文件中的内容应该包含在条件编译的预处理指令中,这样可以避免重复编译
文件中使用的宏名称应该根据文件名变化得到
如果一个源文件里希望使用另外一个源文件中声明的全局变量,就需要使用 extern关键字,再次把这个变量声明一次
vi main.c
#include <stdio.h>
#include "read.h"
int main()
{
read();
printf("num=%d\n",num);
return 0;
}
vi read.h
#ifndef _READ_H_
#define _READ_H_
extern int num;
void read(void);
#endif
vi read.c
#include <stdio.h>
#include "read.h"
int read(void)
{
printf("请输入一个数字:");
scanf("%d",&num); //想要用num,必须使用extern
}
使用extern关键字声明变量的语句,不会分配内存,所以可写在头文件中
静态全局变量,不可以被其它文件中的语句使用.
静态全局变量的作用域就是这个文件,不能跨函数实现
#define 预处理指令用来定义宏
#include <stdio.h>
#define PI 3.14f
int main()
{
int radius =10;
printf("请输入半径:");
scanf("%d",&radius);
printf("周长=%f\n",2*PI*radius);
return 0;
}
在编译命令里使用-D选项指定宏所代表的内容
#include <stdio.h>
int main()
{
int radius = 13;
printf("请输入半径:");
scanf("%d",&radius);
printf("周长=%f\n",2*PI*radius);
return 0;
}
gcc -DPI=3.14f m.c
宏不可以使用自己的存储区实现和函数之间的数据传递,宏没有形式参数和返回值
因为宏没有返回值,所有能当作数字使用的宏,必须写在一对小括号里面,才能保证优先计算内部的操作符
不能把自增或自减的计算 结果作为宏的参数使用
#define SUB(x,y) ((x-y))
#是一个宏操作符,它可以把宏的一个参数转换成字符串字面值
#include <stdio.h>
#define STR(n) #n
int main() {
STR(2+3);
return 0;
}
##也是一个宏操作符,它可以把一个代表标识符的参数和其它内容连接形成一个新的操作符
#include <stdio.h>
#define STR(n) #n
#define LOCAL(n) l_##n
int main() {
int num=0;
int LOCAL(num)=0;//int l_num = 0;
STR(2+3);//"2+3"
return 0;
}
条件编译:
#ifdef........#else......#endif
#include <stdio.h>
int main()
{
int order = 0;
printf("请输入一个数字:");
scanf("%d", &order);
#ifdef ZHAOBENSHAN
if(order ==1)
printf("没有\n");
else
printf("真没有\n");
#else
if(order==1)
printf("有\n");
else
printf("没有\n");
#endif
return 0;
}
gcc -DZHAOBENSHAN m.c
多文件编程基本步骤:
1. 把所有函数分散在不同的源文件里(通常主函数单独占一个字节)
2. 为每个源文件编写配对的以.h作为扩展名的头文件
3. 在每个源文件里使用#include预处理命令,包含必要的头文件
例子1:
main.c add.h add.c
vi main.c
#include <stdio.h>
#include "add.h"
int main()
{
int num=add(2,7);
printf("num=%d\n",num);
return 0;
}
vi add.h
int add(int,int);
vi add.c
#include "add.h"
int add(int num,int num1)
{
return num+num1;
}
例子2:
vi main.c
#include <stdio.h>
#include "read.h"
int main()
{
int num=fun();
printf("num=%d\n",num);
}
vi read.h
#ifndef _FUN_H_
#define _FUN_H_
int fun(void);
#endif
vi read.c
#include <stdio.h>
#include "read.h"
int fun(void)
{
int num=0;
printf("请输入一个数字:");
scanf("%d",&num);
return num;
}
gcc main.c read.c
Makefile实现文件程序的编译
Makefile文件中记录整个编译过程,make工具按照Makefile中记录的过程完成编译
Makefile文件中每个编译命令前都应该写tab键而不是空格
头文件中的内容应该包含在条件编译的预处理指令中,这样可以避免重复编译
文件中使用的宏名称应该根据文件名变化得到
如果一个源文件里希望使用另外一个源文件中声明的全局变量,就需要使用 extern关键字,再次把这个变量声明一次
vi main.c
#include <stdio.h>
#include "read.h"
int main()
{
read();
printf("num=%d\n",num);
return 0;
}
vi read.h
#ifndef _READ_H_
#define _READ_H_
extern int num;
void read(void);
#endif
vi read.c
#include <stdio.h>
#include "read.h"
int read(void)
{
printf("请输入一个数字:");
scanf("%d",&num); //想要用num,必须使用extern
}
使用extern关键字声明变量的语句,不会分配内存,所以可写在头文件中
静态全局变量,不可以被其它文件中的语句使用.
静态全局变量的作用域就是这个文件,不能跨函数实现
相关文章推荐
- 组合查询
- 批处理存入数据库
- CSS中外边距叠加问题
- 正则表达式大全---入门篇
- 在VC/MFC中嵌入Google地图——图文并茂
- 2016第二周五
- 一筐鸡蛋的问题
- VB学习要点1----日期型数据作算术运算
- 3D可视化技术之Cult3D【实战动画效果小汽车】
- [递归和循环]面试题7
- Fragment销毁时replace和add两个方法的区别
- UI性能测试
- Android EditText 明文变为密文
- 自定义View实现雨点洒落效果
- MySQL 中文显示乱码
- 在popupWindow里响应硬件的back按键的事件
- 【菜鸟学Java】8:List实体集合中保证产品名称不重复
- T-SQL查询进阶--详解公用表表达式(CTE)
- 统计网站浏览量
- MTK android 重启测试脚本