导图社区 编译预处理
C语言之编译预处理重点知识总结,一张图带你了解在Linux系统下如何gcc编译执行。
怎么学好数学,在学习高中数学时,首先要理解概念,而不是死记硬背。对于难以理解的概念,可以通过画图、举例子等方式来帮助自己理解。
DCM4623调试步骤的思维导图,主要在于确保电子设备的正常运行,并及时发现和修正潜在的问题。
数据库理论与应用,在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
编译预处理
以#开头的命令都是编译预处理命令
包含文件(#include)
#include <stdio.h>
在系统指定目录寻找.h文件
#include "stdio.h"
在整个工程内寻找.h文件
头文件
.h
声明 宏定义相关参数 构造结构体类型等等
源文件
.c
定义函数,定义变量等等
宏定义(#define)
#define A B
用A代表B
A是个字符常量
#define SUCCESS 1 #define FAULT 0
程序执行时
用B完全替换A
不带参数
#define PI 3.14
定义常量
带参数
#include #define SUM(x,y) x+y int main() { int c = 3*SUM(2,3); printf("c = %d\n",c);//9 return 0; }
#define SUM(x,y) (x+y)
完全替换
加()
宏定义后面不要加;
函数和宏定义的比较
宏定义执行效率高,但是没有类型检测,没有函数严谨
条件编译(#if)
#if 表达式 程序1 #else 程序2 #endif
#define N 2 #if (N==1) #include int main() { printf("11111\n"); return 0; } #endif #if (N==2) #include int main() { printf("22222\n"); return 0; } #endif #if (N==3) #include int main() { printf("33333\n"); return 0; } #endif
如果表达式为真,编译程序1,否则编译程序2
和宏定义结合
对操作系统、GUI等等进行裁剪
#ifndef 标识符 #define 标识符 #endif
防止重复编译
32个关键字
int long short unsigned signed float double char void sizeof 10个
if else switch case default for while do break continue goto return 12
struct union enum
static extern
auto
自动变量,未加任何修饰的局部变量默认就是自动变量。
register
修饰寄存器变量,直接从寄存器内获取变量的值,增加读写速度
编译器有时会把变量自动优化成寄存器变量
volatile
修饰变量,每次取数,都从物理地址取数。(防止编译器优化)
const
修饰的空间不能改变
const int a = 100; a =10;//错误,不能修改a的内容
扩展
const 修饰指针
const int *p;
修饰的是*p
int * const p;
修饰的是p
int const *p;
和第一种相同
typedef
类型重定义
后面的代替前面的使用
#include "stdio.h" typedef struct tagSTUDENT { int no; char name[10]; float score; }STUDENT; int main() { STUDENT student1;//等效struct tagSTUDENT student1; } #include "stdio.h" typedef unsigned int u32;//分号不可以省略 int main() { u32 i = 0;//等效 unsigned int i = 0; }
typedef和宏定义的区别
#include "stdio.h" typedef unsigned int * u32p;//分号不能省略 #define u32p1 unsigned int * int main() { u32p p1,p2;//定义两个指针变量 u32p1 p3,p4;//完全替换 -- unsigned int *p3,p4; p3是指针变量,p4是整形变量 }
位操作
<< >> | & ~ ^
|:位或
任何数或上1结果都为1,或上0为本身,经常用来置1
&:位与
任何数与上0结果都为0,与上1为本身,经常用来置0
~:取反
0变1,1变0
^:异或
不同为1,相同为0
任何数与1异或 -- 取反
任何数与0异或--本身
所有位往左移,左舍弃,右补0
>>:右移
所有位往右移,右舍弃,左补零
示例
把变量b的第a位置1
char b = 10;//0000 1010 char a = 2; 0000 1010 | 0000 0100 0000 1010 | 1<<2 b = b|(1<<a); b |= 1<<a;//把b的第a位置1
把变量b的第a位置0
char b = 10;//0000 1010 char a = 3; 0000 1010 & 1111 0111 0000 1010 & ~(1<<3) b = b&(~(1<<a)); b &= ~(1<<a);//把b的第a位置0
把变量b的第a位取反
b ^= 1<<a;
模块化编程
每一个模块都建立一个.c和一个.h文件, 想使用该模块时,包含对应的.h文件就可以了
.c文件写函数、变量的定义
.h文件写函数的声明、类型的定义等
.h文件要写防止重复编译的预处理命令