C语言知识一 GCC与编译过程

  对于计算机语言的学习,我们需要学习(1)基本的程序设计的思想;(2)语言工具的特性。基本的程序设计思想是对所有程序设计语言而言的,是通用的;而语言工具的特性是针对具体的语言而言的,是每种语言独特的。这里我们关注的是语言工具的特性。c语言的工具特性为:(1)对于底层的操作,如对内存地址的寻址和操作,对指针的使用;

  对于c语言的学习,重视:(1)c语言的设计思想,与核心规律;(2)理解掌握,什么时候用?什么时候用?为什么要这样设计?

 一:GCC的使用和常用选项

1、gcc概述

  gcc起初的名字为GNU c compile,后来随着支持的语言变多,变为GNU compile collection。gcc是可以理解为翻译官,翻译组织,包含有翻译成员。不同成员之间相互配合,完成人与人之间交流的语言转变为机器可以识别的二进制指令,在计算机上执行,也就是人与机器之间交流的桥梁。常用的指令选项有:(1)gcc -o output mian.c  (2)gcc -c -o main.o main.c  (3)gcc -S -o main.s main.c  (4)gcc -E -o main.i main.c  (5) gcc -I 包含头文件的路径

  可以使用gcc -v -o build main.c 命令查看整个编译链接的过程。整个过程分为(1)预处理(2)编译(3)汇编(4)链接

2、c语言的编译过程

  预处理:

  cpp -o main.i main.c

  在查看整个编译链接的过程中看不到,在命令cc1执行中包含了该命令的执行。

  实际使用命令:gcc -E -o main.i main.c

  编译:

  /usr/lib/gcc/i486-linux-gnu/4.4.3/cc1 -quiet -v main.c -o /tmp/ccW03FvH.s .....(还有一些其他选项)

  实际使用命令:gcc -S -o main.s main.c

  汇编: 

  as -V -Qy -o /tmp/cctZ6SQm.o /tmp/ccW03FvH.s

  实际使用命令:gcc -c -o main.o main.s

  链接:

  lib/gcc/i486-linux-gnu/4.4.3/collect2 -o build main.o .....(还有很多其他的.o,自己的或者系统的)

  实际使用命令:gcc -o build main.c

3、编译过程中的一些常见错误

  预处理错误:#include<>(引用库中的头文件);#include ""(引用自己写的头文件),可能会出现找不到文件的错误。<>表示到系统的环境变量中去找,“”表示在当前目录中寻找文件。自己写的头文件可以放到一个目录下,用gcc -I 添加查找头文件的目录。

  编译错误:常见语法错误

  链接错误:(1)原材料不够,查找的函数具体实现没有被链接进来(2)原材料多余,查找的函数具体实现重复了

4、宏的使用

#include

#define

#ifdef #else #endif

预定义宏:__FUNCTION__  __LINE__  __FILE__

   调试版本和发行版本的处理:(1)在文件中通过添加#define ABC进行条件预编译处理,添加或者去除处理;(2)通过命令 gcc -DABC 处理,-D后面不能有空格。两者否需要在其他处用#ifdef  #else  #endif  实现处理

  #define 定义函数和使用,实现的原理类似于python的lamda函数。#号实现字符串化,##号实现连接,相当于前缀后缀。

 

原文地址:https://www.cnblogs.com/zjsthunder/p/11296554.html