C语言高级语法概述笔记

来源:互联网 发布:成都正规java培训机构 编辑:程序博客网 时间:2024/05/01 03:36

GCC 全称 GNU C  compile  GNU 是一个开元组织 C 的编辑器 现在 GCC变成了 多种 语言编辑器 

作为 嵌入式开发人员对于GCC要非常了解

gcc -v查看默认安装 版本

gcc -o output

gcc -o 输出文件 输入文件

gcc -v -o build 001.c  打印出许多服务信息

预处理

gcc -o a.i 001.c

替换

gcc -E

编译

/usr/lib/gcc/i486-linux-gnu/4.4.3/cc1 -o  a.s 001.c

(gcc -S)

汇编

as -o  a.o a.s

(gcc -c)


连接

usr/lib/gcc/i486-linux-gnu/4.4.3/collect2 -o build  a.o+..................

gcc -o build 001.c  

define include 不是关键字  在预处理就已经处理完了  关键字实在编译阶段处理的

硬件芯片操作的最小单位

bit  1 0



预处理中的错误

#include"name" 当前工程编译

#include<name>系统库里编程

not find

gcc -I 查找头文件目录

编译错误

; {}弄错

链接错误  链接就是把.o文件生成一个可执行程序 

原材料多了 或不够  就是在编程是 函数 没有写完 但是声明了 或者 写重复了

root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -I./inc -o build 001.c abc.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# ls
001.c  002.cpp  123.txt  abc.c  a.i  a.o  a.s  build  inc
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -I./inc -c 001.o 001.c
gcc: 001.o: 没有那个文件或目录
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -I./inc -c -o a.o 001.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# ls
001.c  001.o  002.cpp  123.txt  abc.c  a.i  a.o  a.s  build  inc
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -c -I./inc -o b.o abc.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -o build a.o b.o
root@yxcq-desktop:/mnt/hgfs/mnt/src# ls
001.c  001.o  002.cpp  123.txt  abc.c  a.i  a.o  a.s  b.o  build  inc


函数预处理宏 不需要定义 函数库里定义好的

__FUNCYION__,__FILE__,__LINE__

#include<stdio.h>


int main()
{
        printf("the %s,%s,%d\n",__FUNCTION__,__FILE__,__LINE__);


        return 0;






}
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"002.c" [新] 11L, 107C 已写入                                                                              
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -o build 002.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# ./build
the main,002.c,5


#include 包含头文件

#define 宏 替换   不进行语法检查

#define   宏名   宏体  加括号

#define ABC  5+3

printf  ("the %d\n",ABC*5); 5+3*5    就会出错


#define ABC(x) (5(x))加括号 



条件预处理举例

gcc -DABC = #define ABC 

#include<stdio.h>
int main()
{
        #ifdef ABC
                printf("======%s=======\n",__FILE__);
        #endif
                printf("hello world\n");
        return 0;




}


root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -o build 003.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# ./build
hello world
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -DABC -o build 003.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# ./build
======003.c=======
hello world


#  字符串化

##连接符号

#define  ABC(x) #x

#define ABC(x) day##x

int main()
{
        int myday1=10;
        int myday2=20;


        printf(ABC(ab\n));


        printf("the day is %d\n",DXY(2));


        return 0;






}
~
~
~
~
~
~
~
~
~
"004.c" 17L, 180C 已写入                                                                                   
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -o build 004.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# ./build
ab
the day is 20


关键字

编译器 预先定义了一定意义 的字符串

int a

32关键字


sizeof 编译器 查看内存空间容量的一个工具

#include<stdio.h>
int main()
{


        int a;
        printf("this is a %d\n",sizeof a);
        return 0;
}


return

返回作用


硬件芯片操作的最小单位

bit 0 1

软件操作的最小单位 8bit=1B

8bit =256 最大数据

char a=300 就会溢出


大小

根据编译器来决定

编译器的最优处理大小   

系统一个周期所能处理的最大单位  int

32bit 4B INT

16bit 2B    INT

char a=3 整型常量



无符号   数据

有符号  数字


内存空间的最高字节  是符号位 还是 数据



大小


float 4B

double 8B

浮点型常量

1.0 2.3 都是 占用 8B


结构体 就是 一些变量累加 组成内存空间

共用体 就是各个变量共用起始地址的一段内存  主要应用一些技巧性代码


枚举

就是一个整型常数的集合

#include"stdio.h"


enum abc{MON,TUE,WEN};


int main()
{


        printf("the %d\n",WEN);


        return 0;


}
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"006.c" [新] 12L, 97C 已写入                                                                               
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# 
root@yxcq-desktop:/mnt/hgfs/mnt/src# gcc -o build 006.c
root@yxcq-desktop:/mnt/hgfs/mnt/src# ./build
the 2

typedef

数据类型的别名

int a =10

int b=100

len_t

time_t

len_t a = 10

time_t = 100

更加方便理解

CPU 顺序执行的程序

PC指针



资源属性中位置的确定 由类型修饰符确定

auto

int a 放在内存中可读可写的地方

{}放在栈空间 可读可写


register int a

限制变量定义在 寄存器上的修饰符

定义一些快速访问的变量

编译器尽量安排CPU存储这个a 如果寄存器空间不足时 安排在存储器

&这个符号 对register 不起作用


static

静态

应用场景

三种数据

1)函数内部的修饰

int fun()

{

int a====>static int a

return 0;

}

2)函数外部修饰符

int a=====>staticint a

int fun()

{



}

3)函数的修饰符

int fun();====>static int fun();


extern

外部声明

const

常量的定义 

只读的变量

const int a

可以修改


voiatile

告知编译器 编译方法的关键字 不优化


右移 >>

有一个问题  但是负数右移时  符号位 根据 正负数 是1 或是0  如果 while(a)

就会出错  永远不为0

0 0
原创粉丝点击