嵌入式Linux C
www 原则:what why how
编译型语言
源代码 –>编译器–>二进制文件
解释型语言
shell 、html
<<C Programing language>>
语言关注度排行
c
java
c++
objective -c(oc)
main 函数—>程序的入口
程序一个入口,一个出口(多个位置)
main函数的一些写法
main() —不推荐
main(void) —不推荐
void main() —不推荐
int main(void) —标准
int main(int,char**) —没有参数名,不推荐,二级指针
int main(int,char*[]) —不推进啊
int main(int argc,char **argv) —不推荐
int main(int argc,char *argv[]) —标准
int main(int argc,char *argv[],char *env[]) –env环境变量
argc 代表命令行参数个数,
argv 参数列表
文件类型
*.c c语言源文件source
*.cpp *.cxx c++语言源文件
*.h 头文件header
*.o 目标文件object,已经过编译的二进制代码,但未链接
*.so *.a 库文件library(for Linux) .a问静态库 .so 动态库、共享库
*.dll (for windows)
.png 杂项
.jpg
…
.ini
项目结构
src 源文件
include/inc 头文件
obj 目标文件
lib 库文件
bin 二进制可执行文件
gcc
-o 指定输出文件名
-E 在预处理期完成后就停止编译过程,得到 .i文件
-S 在编译期完成后停止编译过程,*.s
-c 在汇编期完成后停止编译过程,*o
-I 指定头文件的路径
多行注释匹配原则
与上一个距离最近且未被匹配的符号进行匹配
多行注释不可嵌套
需要注释多行注释可使用条件编译
条件编译(预处理指令)
#if 0
/*写在里面的都将被删除
#endif
c 语言有两种条件逻辑,一种是0 一种是非0
#include <头文件>
#include “头文件”
1、C标准库函数的头文件
2、由程序员自定义的头文件
3、第三方的库的头文件
<>和“”区别在于在编译的过程中,头文件的搜索路径不同
<> 优先从系统头文件路径开始搜索
“”优先从用户制定的头文件路径开始搜索
预处理
gcc -E -o example.i example.c 指到这个预处理期过程就停止,得到的就是
执行的是文本操作,
a.展开include指令 ,把所有包含的头文件都进行引导
b.条件编译 解析#if的内容,将逻辑假内容删除
c.宏展开
#define 定义的宏名都替换成其相应的值
d.删除注释
在c语言中定义两个相同的变量,会报错,从定义
编译阶段
把已经预处理后的代码编译生成汇编代码
gcc -S -o example.s example.i
汇编阶段
编译汇编代码 vi 使用的是asscii格式查看文本,可以使用 bvi安装插件查看二进制代码
gcc -c -o obj/helloword.o src/helloword.c
链接阶段
将目标文件和库文件、其他目标文件进行链接,生成可执行文件
gcc -o bin/helloword obj/helloword.o
C语言的算法
有穷性,确切性,输入,输出,可行性
-1%256= 255 ==> (-1+256)%256=255
printf()函数
%d 有符号十进制整数 int
%c 字符 char ‘a’
%s 字符串 char * “aaaa”
%o 有符号八进制
%x 十六进制
%p 地址指针 0xffffffff
%f 浮点数 float
32位系统—> 寻址空间为32bits —>实际操作只有3Gb
0x0000 0000 0000 0000 0000 0000 0000 0000
……..
0xffffffff ………
0x0000 0000
用户空间
0xc000 0000
内核空间
0xffff ffff
所有进程运行在内核态
库函数的使用
%s/;$/\n{\n}/g 替换全部的;结尾的 然后换行{换行} 替换全部
执行编译
gcc -c -o obj/fun.o src/fun.c -Iinclude
gcc -c -o obj/main.o src/main.c -Iinclude
-Iinclude 表示-I后面进阶自己写的头文件的目录
执行链接
gcc -o bin/main obj/main.o obj/fun.o