条件编译指在编译时根据某些条件从所有代码中抽取出一部分进行编译。使用条件编译可以从同样一段源程序编译出多个不同的执行程序。条件编译采用如下语法
#ifdef 宏名称
代码1
#else
代码2
#endif
如果在前面已经定义过叫做宏名称的宏则编译代码1,否则编译代码2。
#ifndef预处理指令也可以用于条件编译,它的作用和#ifdef刚好相反。
使用如下语法可以实现多分岔的条件编译
#if 逻辑表达式
#elif 逻辑表达式 (可以有多条)
#else (可有可无,最多一条)
#endif
具体参考练习10nike.c
条件编译可以实现跨平台的开发,条件编译可以区分调试阶段和发布阶段
多文件程序的编写要求把所有函数分散在多个.c源文件中。把除了main函数以外所有函数的声明提取到.h头文件中。头文件必须使用条件编译语句避免被同一个源文件多次包含。一个源文件如果需要使用某一个函数则必须包含那个函数声明所在的头文件,如果一个源文件实现了一个函数则也应该包含这个函数声明所在的头文件。
首先对所有.c源文件进行编译(使用-c选项)得到.o目标文件,然后使用gcc把所有目标文件链接起来得到最终的执行文件。
Makefile可以简化多文件程序的编译过程。例子参考Makefile文件。make命令在运行后会在当前目录中查找名叫Makefile的文件并按照里面记录的命令顺序执行。
结构体可以把多个不同类型的变量合并成一个新的数据类型。声明结构体语法如下
struct 结构体名称 {
各具体变量的声明
};
结构体声明语法仅仅描述了结构体类型的内部结构,不会产生心变量,所以不能在结构体声明内部对具体变量进行初始化。
#include <stdio.h>
#define PI 3.14f
#define CIRCLE(r) 2 * PI * r
#define AREA(r) PI * r * r
#define CHUN 3
#define XIA 2
#define QIU 1
#define DONG 0
int main() {
int radius = 0;
printf("请输入一个圆的半径:");
scanf("%d", &radius);
printf("圆的周长是%g\n", CIRCLE(radius));
printf("圆的面积是%g\n", AREA(radius));
return 0;
}
/*
用宏计算两个数字中较大的那个
*/
#include <stdio.h>
#define MAX(x,y) x > y ? x : y
int main() {
printf("MAX(3,7)是%d\n", MAX(3,7));
return 0;
}
/*
用宏完成大小写字符的转换
*/
#include <stdio.h>
#define UP(c) c > 'a' ? c - 'a' + 'A' : c - 'A' + 'a'
int main() {
printf("UP('t')是%c\n", UP('t'));
printf("UP('R')是%c\n", UP('R'));
return 0;
}
/*
宏的练习
*/
#include <stdio.h>
#define SECPHOUR (60 * 60)
#define TOHOUR(sec) ((sec) / SECPHOUR)
int main() {
int sec = 0;
printf("请输入秒数:");
scanf("%d", &sec);
printf("转换成的小时数是%d\n", TOHOUR(sec));
printf("加3600秒以后转换成的小时数是%d\n", TOHOUR(3600 + sec));
return 0;
}
/*
求相反数的练习
*/
#include <stdio.h>
#define NEG(n) (0 - (n))
int main() {
printf("7 - NEG(3)是%d\n", 7 - NEG(3));
printf("NEG(2 + 3)是%d\n", NEG(2 + 3));
return 0;
}
/*
计算数字平方的宏
*/
#include <stdio.h>
#define SQUARE(n) ((n)*(n))
int main() {
int value = 3;
printf("SQUARE(++value)是%d\n", SQUARE(++value)); //错误,变量自增自减的计算结果不可以当成宏的参数使用
return 0;
}
/*
宏运算符练习
*/
#include <stdio.h>
#define STR(n) #n //#可以把参数中得到的内容转换成字符串字面值
#define GLOBAL(n) g_##n //##可以把参数中得到的标识符和其他内容合并得到一个新标识符
#define LOCAL(n) g_##n
int GLOBAL(value) = 3; //变量名是g_value
int main() {
int value = 7;
int LOCAL(value) = 9;
printf("%s\n", STR(2 + 3));
printf(STR(value)"是%d\n", value);
printf("GLOBAL(value)是%d\n", GLOBAL(value));
printf("LOCAL(value)是%d\n", LOCAL(value));
return 0;
}
/*
预定义宏练习
*/
#include <stdio.h>
int main() {
printf("行号:%d\n", __LINE__);
printf("文件名:%s\n", __FILE__);
printf("日期:%s\n", __DATE__);
printf("时间:%s\n", __TIME__);
printf("%sC标准\n", __STDC__ ? "符合" : "不符合");
return 0;
}
/*
条件编译练习
*/
#include <stdio.h>
//#define ZHAOBENSHAN
int main() {
int order = 0;
printf("请点菜:");
scanf("%d", &order);
#ifdef ZHAOBENSHAN
if (0 == order) {
printf("这个没有\n");
}
else {
printf("这个真没有\n");
}
#else
printf("这个菜有\n");
#endif
return 0;
}
/*
条件编译练习
*/
#include <stdio.h>
int main() {
#if defined(ELITE)
printf("120%%\n");
#elif !defined(FACTORY)
printf("100%%\n");
#else
printf("80%%\n");
#endif
return 0;
}
/*
多文件练习
*/
#include <stdio.h>
#include "readInt.h"
int main() {
int value = 0, value_1 = 0;
printf("请输入一个数字:");
value = readInt();
printf("请输入一个数字:");
value_1 = readInt();
printf("%d %d\n", value, value_1);
return 0;
}
/*
多文件练习
*/
#include <stdio.h>
#include "add.h"
extern int res; //extern表示变量声明在其他源文件中,当前源文件只是使用这个全局变量
int main() {
add(2, 5);
printf("%d\n", res);
return 0;
}
/*
结构题练习
*/
#include <stdio.h>
struct Person {
char gender;
int age;
float height;
};
int main() {
/*struct Person {
char gender;
int age;
float height;
} person;*/
struct Person person; //结构体变量声明语句,别忘了struct关键字
struct Person person1 = {'M', 23, 1.78}; //结构体变量初始化语法
printf("请输入性别,年龄和身高:");
scanf("%c %d %f", &person.gender, &person.age, &person.height);
printf("性别是%c\n", person.gender);
printf("年龄是%d\n", person.age);
printf("身高是%g\n", person.height);
return 0;
}
#include <stdio.h>
#include "add.h"
//static int res; //静态全局变量的作用域被限定在当前文件内,其他文件中是不可以使用这个静态全局变量的
int res;
void add(int x, int y) {
res = x + y;
}
#include <stdio.h>
#include "readInt.h"
int readInt() {
int value = 0;
while (!scanf("%d", &value)) {
scanf("%*[^\n]");
scanf("%*c");
printf("请重新输入数字:");
}
scanf("%*[^\n]");
scanf("%*c");
return value;
}