GCC 使用摘记

1. 几个子程序和说明
cc1C 的实际编译程序
cc1plusC++ 的实际编译程序
collect2在不使用 GNU连接程序的系统上,用来产生特定的全局初始化代码
crt0.o为每个系统定制的初始化和结束代码
libgcc默认连接的 gcc 例程库
libstdc++默认连接的 g++ 例程库


2. 几个重要的和 GCC 协同工作的程序,主要来自 binutils 包。
addr2line将文件中的调试信息翻译成为源文件的对应行号
ar用于维护目标代码的 archive,也就是创建库的程序
asGNU 的汇编器
c++filt用于完成 C++ 和 Java 的 mangling/demangling
gcovgprof 的配置工具
gprof报告各个函数的执行时间
ldGNU 的连接程序
nm列出目标文件中定义的符号
objcopy完成目标代码的复制和翻译
objdump显示目标文件的各种信息,包括代码的反汇编结果
ranlib创建和添加 ar 创建的库文件的索引
readelf获取 elf 文件信息
size列出目标文件中每部分的尺寸
strings从目标文件中析取可显示的字符串
strip从目标文件/库中去掉符号表以及其它调试使用的信息


3. 预处理程序,最常见的 C 使用的预处理命令,如 #define 和#undef,
#if #elif #else #endif,#ifdef 和 #ifndef,#include,##(连接字符)就不多说了。
#error 会引起 cpp 的中断,而 #warning 仅仅给出警告而不中断。
#pragma 主要是用于定义编译器相关的一些命令,GCC 中可用的有
#pragma GCC dependency "file" warning information
定义了该文件对 file 的时间戳依赖关系,即如 file较当前文件新则发出警告。
#pragma GCC poison function-name
如果使用了 function-name 则发出警告。与 #pragma 等价的有_Pragma("")
表达,这是为了在 macro 内部也能使用该功能引入的。

4. 预定义的宏
__NASE_FILE__源文件的完整路径名,和 __FILE__不同,被引用的文件仍然是原来文件名
__CHAR_UNSIGNED__用于指定该机器上 char 是无符号类型
__cplusplus使用 C++ 编译器编译
__DATE__编译时的日期
__FILE__编译文件名
__func__同 __FUNCTION__
__GNUC__GCC 的主版本号
__GNUC_MINOR__GCC 的次版本号
__GNUC_PATCHLEVEL__GCC 的修订号
__GNUG__由 C++ 编译程序定义
__INCLUDE_LEVEL__指 #include 的层次
__LINE__当前行号
__NO_INLINE__不允许 inline
__OPTIMIZE__打开了优化选项
__OPTIMIZE_SIZE__打开了对编译出文件尺寸的优化
__STDC__表示该程序符合 ansi C 标准
__STDC_HOSTED__表示宿主具有标准 C 的环境
__STDC_VERSION__标准 C 制定时间
__TIME__编译时系统时间
__VERSION__GCC 版本号


5. 在 iso646.h 中为操作符定义了 C++ 对应的操作符名称,如 and,or等

6.产生依赖关系列表,gcc -E -M src

7. GCC 对 C 的扩展主要有,__alignof__( typename )返回对齐信息,可以
使用参数变长数组(在函数里面定义),同时还可以把该数组作为参数传递,
void f( int length, char buf[length] )
如果需要倒着写,需要前向声明,用分号隔开
void f( int length; char buf[length], int length )
允许结构体最后一个成员为 0 长度数组,这样可以创建变长数组。

通过 __attribute__ 可以给函数增加额外的信息便于优化,如((noreturn))
表明没有返回值,又如 pure 表明不会修改全局变量,noinline 表示不会inline,
align(n) 表示执行对齐,weak,alias 连用表示是别名,always_inline表示
总会 inline,const 不访问全局内存便于优化,constructor 是比 main更早调用
的函数,destructor 是在 exit() 之后调用的,deprecated表示过时了编译时发出
警告,format( style, str-pos, var-pos ) 要求编译器检查是否为style(如 printf 和 scanf)
的函数,str-pos 是字符串参数的位置,var-pos是可变长度参数列表的开始位置。
类似的还有 format_arg。malloc 告诉编译器其返回指针和 malloc一样对待,
no_intrument_function 不会进行 profiling,section("sec-name")将代码放入指定段。

类似的一些可以修饰变量,另有 mode(指定为 byte、word 或者pointer),nocommon
(不会作为公共变量),packed(没有间隙),vector_size,类似数组。

复合语句 {} 可以返回值,用 () 包裹之,但不适用于 C++。y? y : z可简写为 y? : z。
可以对 enum 进行声明但不定义

另有底层的三个函数,__builtin_apply_args(),__builtin_apply() 和__builtin_return()
可以把当前函数的参数直接传递给后面的函数。
而 __builtin_return_address() 返回 ret 时应跳转的地址(frame中第一个记录的 %ebp)
__builtin_frame_address( int ) 返回第几层的 frame 起始地址。

允许函数嵌套定义,并且该函数地址可以传递。支持 $ 命名变量名,goto的 label 可以用
&& 取址并赋值给变量进行 goto。__label__ 可以声明局部标识为goto 使用。只要左值表
达式产生左值(地址)即可。

可变参数宏,c99 标准为使用 ... 和 __VA_ARGS__。

在 switch 中支持 case 1 ... 9 这种表达。支持 typedettypename=var,从而将某变量的类
型定义为需要的类型。typeof(var) 产生 var 的类型。

8. C++ 里面另有 __PRETTY_FUNCTION__,而 #progma interface 和#pragma implementation
可以表示类的性质,另有 >? 和 <?表示返回较大较小的,并可以重载。C99 中 restruct 关键字
可以用 __restrict__。

9. C++ 中调用 C 程序只需要 external "C" 声明即可。而 C 中调用 C++函数也是用 external "c"
声明函数并用 g++ 编译。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不愿意和别人打交道_如果你的交际能力很差,不喜欢与人打交道,这3种职业最适合你...

现在给个飞速发展的社会&#xff0c;在我们日常生活中交际表达能力非常的重要&#xff0c;但是还是有一部分人比较内向&#xff0c;不善于表达自己的内心&#xff0c;也不喜欢和别人接触&#xff0c;那么这一类人从事哪些行业比较合适呢&#xff1f;下面我就跟大家讨论一下。性…

python组合函数_Python---函数---参数组合

# 参数组合# 在Python中定义函数&#xff0c;可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数# 这5中都可以组合使用# 参数定义的顺序必须是&#xff1a;必选参数、默认参数、可变参数、命名关键字参数和关键字参数# 比如定义一个函数&#xff0c;包含上述若干…

Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

在移植内核的时候&#xff0c;通常会遇到引脚复用&#xff08;MUX&#xff09;的配置问题。在现在的Linux内核中&#xff0c;对于TI的ARM芯片&#xff0c;早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的&#xff0c;这次看AM335X的代码顺手写一下分析&#xf…

python生成验证码_python之验证码生成(gvcode与captcha)

今天向大家总结一下python在做项目时用到的验证码生成工具&#xff1a;gvcode与captchagvcode全称&#xff1a;graphic-verification-code安装&#xff1a;pip install gvcode使用&#xff1a;import gvcodes, v gvcode.generate() #序列解包s.show() #显示生成的验证码图片pr…

设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则

&#xff08;3&#xff09;单一职责原则 单一职责原则&#xff08;SRP&#xff09;&#xff0c;就一个类而言&#xff0c;应该仅有一个引起它变化的原因。例如&#xff0c;我们在写一个窗体应用程序&#xff0c;一般都会生成一个Form这样的类&#xff0c;于是我们就把各种各样的…

是网关吗_智能家居网关功能这么多,你都知道吗?

在科技发达的今天&#xff0c;我们的生活也开始趋向于智能化&#xff0c;智能家居已经迎来了新时代。电动窗帘、扫地机器人、电视、空调等电器都能智联wifi&#xff0c;可是使用的时候得一个个去控制&#xff0c;数量多的话懒癌们肯定嫌麻烦的。所以很多聪明的人都选择安装智能…

eventfd以及epoll原理分析

这两天公司代码中用到了epoll。然后在跟同事闲扯的过程中发现了Linux中有eventfd。两者虽然名字看起来差不多&#xff0c;但是相关性倒是不多。为了弄明白这两个东西到底在内核上是怎么实现的&#xff0c;这两天将内核这两个部分的相关代码看了下&#xff0c;也终于明白了这两个…

一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

【题目描述】 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量(QoS,Qualityof Service)问题已越来越受到重视。网络中采用的数据包调度机制与网络的服务质量 QoS 有着密切的关系。研究表明传统的基于队列的调…

iOS vs. Android,应用设计该如何对症下药?

摘要&#xff1a;从iOS到Android&#xff0c;两大平台应用设计有何不同&#xff1f;又都存在什么样的问题&#xff1f;Android定制性太高&#xff0c;该如何进行UI设计&#xff1f;在CMDN CLUB第28期活动中&#xff0c;咕咚网高级产品经理王磊&#xff0c;从iOS、Android谈起&a…

postman数据保存在哪里_Postman 历史记录导出的解决方案

Postman 可以说是我在 CTF 中使用最多的工具了。它确实非常好用,但我并没有完全掌握它的使用之道,因此大量的历史请求堆在一起,显得环境无比混乱。 虽说是有想要改变的想法,但这些历史记录还是非常重要的,一时间难以割舍。于是便开始寻找导出的方案。 indexedDB 我们知道,…

cs8900a网卡驱动--寄存器

1. CS8900内部有一个4k的RAM用于访问其内部寄存器&#xff0c;称为PacketPage。 2. LineCTL 网卡状态设置 从上图看到&#xff0c;此寄存器的6&#xff0c;7位用于设置网卡的收发使能。8&#xff0c;9位用于设置网卡状态。是10BASE-T还是 AUI。下面这图更详细介绍了8&…

python输入序列语句_Python基础教程(一) - 序列:字符串、列表和元组

这一章我们主要研究这样一些类型&#xff0c;他们的成员是有序排列的&#xff0c;并且可以通过下标偏移量访问的&#xff0c;这类Python类型统称为序列&#xff0c;包括字符串、列表和元组。序列类型操作符成员关系操作符(in、not in)&#xff1a;成员关系操作符是用来判断一个…

由于找不到openni2_Kinect开发教程八:OpenNI2显示深度、彩色及融合图像

在《Kinect开发教程二&#xff1a;OpenNI读取深度图像与彩色图像并显示》中&#xff0c;小斤介绍了OpenNI读取深度与彩色图像数据的方法&#xff0c;并且借助OpenCV进行显示。OpenNI2在接口上与OpenNI有了较大变化&#xff0c;具体更新可以查看《OpenNI Migration Guide》。从获…

目录服务用户OSX: ARD的基于目录服务用户权限

改章节笔者在上海游玩的时候突然想到的...今天就有想写几篇关于目录服务用户的笔记&#xff0c;所以回家到以后就奋笔疾书的写出来发布了 从Apple Remote Desktop 3.3开始, 加入了对目录服务用户/用户组的支持, 也就是说可以利用目录用户/用户组, 来定义该用户/用户组的ARD权限…

__builtin_expect详解

在GTK2.0源码中有很多这样的宏&#xff1a;G_LIKELY和G_UNLIKELY。比如下面这段代码&#xff1a; if (G_LIKELY (acat 1)) /* allocate through magazine layer */ { ThreadMemory *tmem thread_memory_from_self(); guint ix SLAB_INDEX (allocat…

python3界面实例_程序人生——python3下tkinter的界面示例

# written by wangluojisuanimport tkinterfrom tkinter import messageboxglobal main_formglobal lbl_nameglobal entry_nameglobal entry_text_varglobal chk_varglobal chkglobal text_areadef window_quit():if tkinter.messagebox.askyesno("提示", "退出…

jQuery图表插件 JS Charts

JS Charts 是一款免费的基于javascript的轻量级插件&#xff0c;用JS Charts 绘制图表是很轻松地事,因为你只需要关心客户端的脚本。 Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...转载于:https://www.cnb…

python官方文档怎么用_python帮助文档怎么使用

在python命令行中输入help()&#xff0c;然后再次输入time&#xff0c;可以获得很详细的模块文档&#xff1b;或者输入time.localtime&#xff0c;可以获得简略的函数参数显示&#xff1b;或者输入range&#xff0c;可以获得很详细的类的文档。方法一在python命令行输入以下内容…

ACCEPT

ACCEPT 章节&#xff1a;Linux 程序员手册 (2)更新&#xff1a;2010-09-10到 易美翻译 翻译名字 accept - 通过套接口接受一个连接 概要 #include Esys/types.h> /* 参看 “注意小节” */ #include Esys/socket.h>int accept(int sockfd, struct sockaddr *addr, sockl…

使用正则把数字前面的符号替换_正则表达式(一) 基本表达式

定义 正则表达式(Regular Expression)用某种模式去匹配一类字符串的公式&#xff0c;主要用来描述字符串匹配的工具。 匹配文本或字符存在不止一个部分满足给定的正则表达式&#xff0c;这是每一个这样的部分都被称为一个匹配。 匹配分为以下三种类型&#xff1a; 形容词性的匹…