关闭

[置顶] Unix/Linux系统下的高级C编程的主要内容1、20160531

标签: DOSc语言gcc
166人阅读 评论(0) 收藏 举报
分类:

1)Unix/Linux系统的基本概述

2)Unix/Linux系统下的编程基础以及开发方式

3)Unix/Linux系统下的内存管理技术

4)Unix/Linux系统下的文件管理和目录操作

5)Unix/Linux系统下的进程管理

6)Unix/Linux系统下的信号处理

7)Unix/Linux系统下的进程间通信

8)Unix/Linux系统下的网络编程

9)Unix/Linux系统下的多线程编程

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

今天内容:

1)Unix/Linux系统的简介(了解)

2)gcc编译器的基本使用

3)多文件结构的编程

4)预处理指令

5)环境变量的概念和使用

6)库文件的概念和使用

-------------------------------------------------

1.Unix/Linux系统的简介

1.1Unix系统的简介

     在1969年左右,使用的是汇编语言编写操作系统,编写以及维护都不方便,汤普逊发明了一门语言叫做B语言,丹尼斯里奇在B语言的基础上 做了修改和扩展,改名为:new B语言,后来改名为C语言。

     C语言  诞生于1972年,一直在编程语言排行榜中占据着重要的地位

 Unix操作系统诞生于1970或1971年,具有三个特点,具有多用户、多任务以及支持多种处理器的特点

1.2 Linux系统的简介

 Linux系统是一款自由免费开放源代码的类Unix操作系统,早期Linux只是用于表示系统的内核,后来大家都习惯于将以Linux作为内核的操作系统统称为Linux系统。Linux系统的标志是企鹅

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

                                                           gcc的基本使用---------编译选项-E -S  -c -o -v -Wall -Werror

2.1基本概念

     原名叫做GUN C Compiler (GUN C语言编译器),只是用于编译C语言,后来做了一些扩展,支持C++、OC等语言的编译器,因此改名为:GUN Compiler Collection (GUN 编译器套间/集合)

2.2基本功能

    gcc    xxx.c 主要包含以下4部分功能:

(1)预处理:主要实现对头文件的包含以及宏替换等

(2)编译:主要将高级语言转换为汇编语言

(3)汇编:主要讲汇编语言翻译成机器指令,得到目标文件

(4)链接:主要将目标文件和库文件进行链接,生成可执行文件

----------------------------------------------------------------------------------------------

源程序(source language)  高级语言(high-level language)

目标代码(object code、machine code)目标语言(target language)

----------------------------------------------------------------------------------------------

在20 世纪 40 年代的程序都是用机器语言(machine language)编写的,机器语言就是表示机器实际操作的代码,例如 C7 06 0000 0002 表示在IBM PC 上使用的intel 8x86处理器将数字2 移至地址0000(16进制)的指令。

-----------------------------------------------------------------------------------------------

但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assembly language)代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令 MOV X,2 就与前面的机器指令等价(假设符号存储地址X 是 0000)。汇编程序(assembler)将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。

-----------------------------------------------------------------------------------------------

汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简介度时尤为如此。但是,汇编语言也有许多的缺点,编写起来也不容易,阅读和理解很难,而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。

-----------------------------------------------------------------------------------------------

发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可以由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与计算机无关的形式 x = 2。

-----------------------------------------------------------------------------------------------

2.3比较常见的编译选项(分别调试)

   -E  进行预处理,-o 指定    输出文件名

   gcc -E xxx.c  -o xxx.i

   预处理的结果默认输出到控制台,使用   gcc -E xxx.c  -o xxx.i将预处理结果定位到xxx.i文件中,预处理之后的文件主要包含:头文件、类型的别名、各种函数的声明等等。

  -S 进行编译处理,生成汇编文件xxx.s       gcc -S xxx.i

  -c 进行汇编处理,生成目标文件xxx.o       gcc -c xxx.s

   gcc xxx.o 表示连接处理,生成可执行文件a.out

  ----------------------------------------------------------------------------------------------------------------------------------

 gcc -E xxx.c  -o xxx.i

=>预处理,生成.i文件

gcc -S xxx.c  或 xxx.i

=>编译,生成.s 文件

gcc -c xxx.c  或 xxx.i  或  xxx.s

=>汇编,生成 .o 文件

 gcc    xxx.c  或 xxx.i 或  xxx.s  或  xxx.o

=>链接,生成a.out 文件

-------------------------------------------------------------------------------------------------------------------------------------

2.4 熟悉的选项

   -std  主要用于指定编译时遵循的C标准

   -Wall 主要用于尽可能多的产生警告信息

   -Werror 主要用于将警告当做错误进行处理

2.5了解的选项

    gcc -v

    -v  主要用于查看gcc的版本信息

    -g 主要用于生成调试信息(gdb 调试)

    -o 主要用于进行优化处理

    gcc -x c++ text.c -lstdc++

    -x  主要用于显示指定源代码的编程语言

2.6扩展的选项

     man  gcc  查看gcc 更多的选项的信息

     星际译王 英文词典

2.7常见的文件后缀

         .c  源文件

         .i   预处理之后的文件

        .s  汇编文件

        .o  目标文件

        .a  静态库文件

      .so  共享库文件

3.1多文件的结构的编程

     .h  头文件主要存放结构体的定义,函数的声明等等

     .c  源文件主要存放变量、函数的定义等等

     .a  静态库文件主要对功能代码的打包

   .so  共享库文件主要对功能代码的打包

3.2头文件中的详细内容

第一部分内容、头文件的卫士

      #ifndef  xxx_H

      #defin  xxx_H

      #endif

第二部分内容、包含其他的头文件

      #include<stdio.h>

      #include<stdlib.h>

第三部分内容、宏定义

      #define  PI 3.1415926

第四部分内容、数据类型的定义,给类型起别名

      typedef struct Node

{

int data;

struct Node* next;

}Node;

第五部分内容、变量/函数的声明

       extern/*外部的*/ int num;

       void show (void);

例如:vim circle.h//计算圆的面积

#ifndef CIRCLE_H  //头文件的卫士

#define CIRCLE_H

#include<stdio.h>//包含其他头文件

#define PI 3.14//宏定义

double  circle_area (double r);//声明计算圆形面积的函数

#endif 

------------------

gcc -c circle.h

删除*.gch文件

cp circle.h circle.c

vim circle.c

#include"circle.h"

double circle_area(double r)定义计算圆形面积的函数

{

return PI*r*r;

}

gcc -c circle.c

删除*.o 文件

vim main.c

#include"circle.h"

int main ()

{

printf("圆形面积是:%lf\n",circle_area(5));

}

gcc *.c

------------------------------------------------------------------------------------

主要;变量/函数的定义不要放在头文件中,避免出现变量/函数的重定义的错误

4.预处理命令

4.1复习预处理指令

    #include  主要用于包含头文件

    #define  进行宏定义

    #undef  取消宏定义

    #if           如果

    #ifdef     如果定义

    #ifndef  如果没有定义

    #elif       否则如果

    #else   否则

    #endif   结束如果

4.2学习新的预处理指令

    #line  整数n(了解)

=>表示从下一行开始 行号变更为第n行

    #warning  字符串

=>表示产生一个警告信息

    #error

=>表示产生一个错误信息

    #if 主要用于在编译阶段进行条件的判断

    if  主要用于在运行期间进行条件的判断

   

     #pragma GCC dependency "指定文件名"文件名 ;指定的文件、最后一次的修改时间、晚于当前文件,则产生警告信息(监控)

=>  表示当前文件依赖于指定的文件名,如果这个指定的文件最后一次修改时间晚于当前文件,则产生警告信息


    #pragma GCC poison 标识符

=> 设置指定的标识符为毒药

#include<stdio.h>

#define GOTO goto //在goto设置为毒药后还想用goto,用宏定义漫天过海使用goto

#pragma GCC poison goto   //将标识符goto设置为毒药,一旦使用goto就会报错

int main(void)

{

       goto ok;                  //表示调到  ok;这一行微笑

       printf("main函数开始执行\n");

       ok;                                                 微笑

               printf("main函数结束\n");

        return 0;

}

:wq

、、、、、、、、、、、、

goto 命令可以构成死循环

no;

goto ok;

ok;

goto no;

、、、、、、、、、、、、、、

#pragma pack (整数n)

=>表示按照n的倍数进行对齐和补齐微笑

//#pragma pack(整数n)的使用,调整对齐和补齐的方式就是为了节省内存空间


#include<stdio.h>

 //#pragma pack(2) //修改默认的对齐补齐方式,按照2的倍数进行对齐和补齐,打印输出为8,

//#pragma pack(1) 按照1的倍数进行对齐补齐,打印输出为6;

//#pragma pack(3) error 必须是2的较小次方;

//#pragma pack(8)超过4按照4的倍数进行处理,并且对齐和补齐的方式必须是2的较小次方

int main (void)

{

        struct S

            {char c1;//一个字节

              int i;//四个字节

              char c2;//一个字节

             };

            printf("sizeof(struct S)=%d\n",sizeof (struct S));//12      结构图默认的对齐与补齐的方式是4的整数倍,打印输出为12

return 0;

}:wq


4.3预定义宏

    __BASE_FILE__ 获取正在编译的文件名  %s

 __FILE__      获取当前宏所在的文件名 %s

 __LINE__      获取当前宏所在的行号  %d

 __FUNCTION__  获取当前宏所在的函数名 %s

 __DATE__      获取日期        %s

 __TIME__      获取时间        %s

作业:编程打印预定义宏的值

明日预报:

    1环境变量的概念和使用

    2库文件的概念和使用

    3C语言中的错误处理





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10278次
    • 积分:197
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:47篇
    • 译文:3篇
    • 评论:2条