C语言基础

1.共用体

在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,
又称联合体。共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同仅在于使用内存的方
式上。
定义一个共用体类型的一般形式为:

union 共用体名
{
成员表列;
  };


注意:
   1.同一时间,只能使用一个成员(如果有一个新成员被赋值,前面成员的值会被覆盖)
   2.共用体的大小有最大成员决定,遵循字节对齐原则

2.枚举 enum 

enum 枚举名{
   枚举成员1,
   枚举成员2,
    ....
   枚举成员n    
};

与struct语法类似,但成员之间使用‘,’隔开,struct使用‘;’

注意:
   1.实质为批量的宏定义,从第一个开始,赋值为0, 往后一次增加一
   2.如果中间的某个成员被赋值,那么依此位置为基准,往后一次增加一
   3.枚举变量要求用枚举成员赋值
   
   作用:

提高代码的可读性

3.工具

3.1gcc

Gcc最基本的用法是∶gcc [options] [filenames]
   
   
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,
通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同
名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个
选项。
-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这
样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-I  头文件的路径
-L  库路径
-l  链接库名   

1.预处理  去注释、头文件展开、宏替换、条件编译等
   gcc -E  test.c -o test.i
   
2.编译    检查语法错误,如果没有语法错误,把.c编译生成汇编文件
   gcc -S  test.i -o test.s
   
3.汇编   把汇编文件编译生成机器码
   
   gcc -c test.s -o test.o
   
4.链接  把所有的.o 和相关库链接起来,生成可执行文件
   
   gcc  test.o -o test  

3.2 gdb

首先使用gcc对test.c进行编译,注意一定要加上选项‘-g’
# gcc -g test.c -o test
# gdb test
   
n   不会进入函数内部,单步执行
s   会进入函数内部,单步执行  

4.多文件编译

.c .h
   
   
头文件的格式:
#ifndef _FUNC_H
#define _FUNC_H
#endif
   
作用:防止头文件重复展开    
   
   
func.c  main.c  func.h 处于同一文件夹下
gcc  func.c main.c -o app    
 
   
   
.
├── app
├── inc
│   └── func.h
├── lib
└── src
   ├── func.c
   └── main.c
gcc ./src/func.c ./src/main.c -o app -I ./inc/

5.make

工程管理器,顾名思义,是指管理较多的文件
Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新
过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作

Makefile格式
   target(目标) :   dependency_files(依赖)
<TAB>  command
      
变量定义的两种方式
递归展开方式VAR=var
简单方式 VAR:=var
变量使用$(VAR)
用”$”则用”$$”来表示
类似于编程语言中的宏

CC=gcc
CFLAGS= -I ./inc
APP:main.o func.o  
   $(CC) $+ -o app
main.o:./src/main.c ./inc/func.h
   $(CC) -c $< -o main.o  $(CFLAGS)
func.o:./src/func.c ./inc/func.h
   $(CC) -c $< -o func.o  $(CFLAGS)
clean:
   rm main.o func.o app    

自动变量
$*
 不包含扩展名的目标文件名称
$+
 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$<
  第一个依赖文件的名称
$?
  所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@  目标文件的完整名称
$^
   所有不重复的目标依赖文件,以空格分开
$%    如果目标是归档成员,则该变量表示目标的归档成员名称

6.条件编译

#if 0
   printf("xxxxxxxxxxxxxxxxxxxxxxx\n");
#elif 1
   printf("YYYYYYYYYYYYYYYYYY\n");
#elif 0  
   printf("YYYYYYYYYYYYYYYYYY111111111111111111111\n");
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值