gcc编译相关知识点及学习心得

一、知识点梳理

1.零碎知识点梳理

  1. gcc编译步骤
    (1)预处理
    作用:读取C语言源文件,对以“#”开头的语句进行处理
    命令格式:gcc -E .c -o .i
    (2)编译
    作用:生成汇编代码
    命令格式:gcc -S .i -o .s
    (3)汇编
    作用:生成二进制代码
    命令格式:gcc -c .s -o .o
    (4)链接
    作用:生成可执行文件
    命令格式:gcc .o -o a.out
  2. typedef
    作用:声明一种新的数据类型
    命令格式:typedef 数据类型 新的数据类型
  3. define和const的区别
    (1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用
    (2)就起作用的方式而言: #define只是简单的字符替换,没有类型检查,存在边界的错误;const对应数据类型,进行类型检查; (3)就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份,占用代码段空间;const定义的只读变量在程序运行过程中只有一份备份,占用数据段空间。
    (4)从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。 (5)从是否可以再定义的角度而言: const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义。
    (6)从某些特殊功能而言: define可以用来防止头文件重复引用,而const不能;
    (7)从用于类中来看:const用于类成员变量的定义,只要一定义,不可修改。define 不可用于类成员变量的定义,但是可以用于全局变量。
    (8)const采用一个普通的常量名称,define可以采用表达式作为名称。
  4. define和typedef的区别
    (1)#define之后不带分号,typedef之后带分号。
    (2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。如:
#define INT1 int
unsigned INT1 n;  //没问题
typedef int INT2;
unsigned INT2 n;  //有问题

(3)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。如:

#defin PINT int *
PINT a,b;   //int *a;int b;

typedef int* PINT;
PINT a,b;    //int *a;int *b;
  1. 调试技巧——宏定义开关和printf
#include  
#define __DEBUG 
#ifdef __DEBUG
#define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__)  
//输出文件路径,行号
#else  
#define DEBUG(format,...)  
#endif  
int main() {  
    char str[]="Hello World";  
    DEBUG("A ha, check me: %s",str);  
    return 0;  
}  
  1. 编译器内置宏
    ANSI C标准中有几个标准预定义宏(也是常用的):
    __ LINE__:在源代码中插入当前源代码行号;
    __ FILE__:在源文件中插入当前源文件名;
    __ DATE__:在源文件中插入当前的编译日期
    __ TIME__:在源文件中插入当前编译时间;
    __ STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
    __cplusplus:当编写C++程序时该标识符被定义。

  2. 函数功能单一简单且频繁调用时使用带参的宏

  3. 头文件卫士

  4. makefile 规则
    目标:依赖文件
    (tab)通过依赖文件生成目标的命令
    依赖文件发生改变下一次make会自动运行相应命令,未改动部分则不用

TARGET = APP
SOURCES = $(wildcard *.c)  //指定编译当前目录下所有.c文件
OBJS = $(patsubst %.c,%o,$(SOURCES))  //函数patsubst:匹配替换,三个参数。第一个是需要匹配的样式,第二个目标样式,第三个是需要处理的由空格分离的列表。
CC = gcc
CFLAGS = -g -c 
LIBS = -lm -lpthread
INCLUDE = -I./include

$(TARGET):$(OBJS)
	$(CC) $(LIBS) $^ -o $@

%.o:%.c %.h
	$(CC) $(CFLAGS) $(INCLUDES) $< -o $@

.PHONY:clean
clean:
	rm -f $(OBJS) $(TARGET)

-Wall:输出所有警告信息
-O:在编译时进行优化
-g:表示编译debug版本

$@–目标文件,
$^–所有的依赖文件
$<–第一个依赖文件
%–Make命令允许对文件名,进行类似正则运算的匹配,主要用到的匹配符是%
10. gcc编译选项
gcc -g
在可执行文件中加入调试信息,方便进行程序的调试
gcc -E
单独执行预处理:gcc -E test.c -o test.i
gcc -S
代码翻译成汇编语言:gcc -S test.i -o test.s
gcc -c
将编译阶段生成的.s汇编文件翻译成二进制机器代码:gcc -c test.s -o test.o
gcc -O
对生成的代码使用优化
gcc -D
定义一个宏
gcc -Idir
在编译源程序时增加一个搜索头文件的额外目录
gcc -Ldir
增加一个搜索库文件的额外目录
gcc -wall
表示产生所有警告
gcc -Werror
含义是将所有警告作为错误(error),即出现警告就停止编译
11. 条件编译
(1)如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译

#ifdef  标识符
  程序段1
#else
  程序段2
#endif

(2)如果标识符没有被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译

#ifndef  标识符
  程序段1
#else
  程序段2
#endif

(3)如果常量表达式为真则对程序段1进行编译;否则对程序段2进行编译

#if  常量表达式
   程序段1
#else  
   程序段2
#endif

二、今日心得

今天学习了gcc编译相关的知识,难度没有上周那么高但是知识点也不少。今天上课有些分神了,所以今天课堂上的内容还得回忆一遍并加以记忆。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值