C
文章平均质量分 72
老和山乔治
宁静致远
展开
-
移位操作行为
arithmetic shift left <-- 移位空缺填0arithmetic shift right <-- 移位空缺填原MSB,即符号位。原创 2023-09-16 15:07:09 · 102 阅读 · 0 评论 -
sigsetjmp & siglongjmp 的小把戏
最近看到 sigsetjmp siglongjmp 的代码,musl里对jmp_buf的写法很独特。原来 C 里面还是有好多东西自己不知道的啊。上面的代码是setjmp.h里的定义,把一个 struct 类型定义成一个数组。第一次看有点让人疑惑。typedef综合上面两点,我们再看jmp_buf的声明,可以看到它是长度为1,类型数组的别名。jmp_buf。原创 2022-10-09 19:37:13 · 405 阅读 · 1 评论 -
为什么我们需要带上类型后缀?U/UL/ULL/L/LL
编码中使用类型后缀可以帮助我们避免很多意想不到的问题,一起来看看吧~原创 2022-08-19 19:07:38 · 4514 阅读 · 0 评论 -
gcc/ld --wrap 选项
ld --wrap 选项--wrap=symbolUse a wrapper function for symbol. Any undefined reference to symbol will be resolved to __wrap_symbol.Any undefined reference to __real_symbol will be resolved to symbol.This can be used to provide a wrapper for a system funct原创 2021-07-11 17:02:25 · 963 阅读 · 2 评论 -
变长参数宏 __VA_ARGS__ 与 ## 的特殊用法
__VA_ARGS__ 与 ## 的特殊用法你可能很熟悉在函数中使用可变参数列表,如:// 变长参数的函数void printf(const char* format, ...);GNU C 中可以用可变参数宏 (variadic macros) 传递可变参数列表。需要注意的是,并不是所有的编译器都支持可变参数宏。C99 中引入了可变参数宏,因此满足 C99 标准的编译器允许定义可变参数宏,这样你就可以使用可变参数表的宏了。可变参数宏像下面这个样子:// format 称为 named argu原创 2021-02-23 16:44:05 · 654 阅读 · 0 评论 -
ELF 文件格式及示例分析
ELF (Executable and Linkable Format)Linux 上源码编译后的 .o 文件即目标文件,目标文件结构上和可执行文件格式很相似,通过链接器链接相应的库后得到可执行文件 .elf。为了描述方便,文中不区分二者的存储格式。elf 存储格式涵盖了程序的编译、链接、装载和执行过程。了解目标文件的对认识操作系统,特别是进程加载方面大有裨益。目标文件包含什么东西呢?显而易见,应该包含代码和数据,另外为了支持链接,其中还有符号表等,为了支持调试,还会有调试信息,等等。Executab原创 2021-02-10 13:19:16 · 1036 阅读 · 2 评论 -
静态链接库与动态链接库的区别与使用
linker & lib大体上 C 程序构建过程可以分为预编译、编译、汇编以及链接四个过程。库的分类库的分类备注优劣static lib将库文件与目标文件在程序构建的链接阶段链接在一起即静态链接。它的好处是程序运行不再依赖系统中存在这样一个库文件供调用,因为它已经在程序可执行文件中了。缺点是如果同一个库被大量程序使用,那么静态链接将导致空间浪费、库有问题修复需要所有使用该库的程序重新编译。dynamic lib动态库的链接是在程序执行的时候被链接的。动态库的原创 2021-01-20 18:49:36 · 474 阅读 · 0 评论 -
浮点数 & IEEE 754 & ARM SIMD / NEON / VFP
Floating point integer提到浮点数,首先要看下定点数是什么概念。在定点数表达法中,其小数点固定地位于实数所有数字中间的某个位置。比如有四位小数,那么所有数字都是有固定的四位小数的,123451234512345 则表示 1.23451.23451.2345。缺点很明显,精度和数据大小无法兼顾。浮点数的表示涉及到不同的处理器的支持情况。对于需要高精度计算的数值分析来说,搞清楚浮点数背后的故事是相当有必要的,这可以减少或消除不必要的精度损失。IEEE 754IEEE 754浮点原创 2020-11-03 14:34:41 · 1015 阅读 · 0 评论 -
数据模型 LP32 ILP32 LP64 ILP64 LLP64
data model1DatetypeLP64ILP64LLP64ILP32LP32char88888short1616161616_int3232int3264323216long6464323232long long6464646464pointer6464643232C 语言定义了一些基本数据类型,但是没有给出数据类型实际的位宽。随着 64bit 处理器的大量使原创 2020-08-18 17:20:43 · 1232 阅读 · 0 评论 -
dereferencing type-punned pointer will break strict-aliasing rules
最近遇到了一个编译告警,严格别名和类型双关,整理一下相关的材料。strict aliasing以下问题摘自1I have the following questions:If I leave the code with this warning, will it generate potentially wrong code?Is there any way to work around this problem?If there isn’t, is it possible to turn原创 2020-07-23 16:25:04 · 6112 阅读 · 0 评论 -
结构体大小和成员对齐 __attribute__ ((packed)) && __attribute__ ((aligned(alignment)))
C语言结构体对齐及大小计算。原创 2020-07-08 19:56:31 · 1229 阅读 · 0 评论 -
GCC 内联汇编
How to Use Inline Assembly Language in C Code1The asm keyword allows you to embed assembler instructions within C code. The asm keyword is a GNU extension. When writing code that can be compiled wit...原创 2019-09-13 19:42:29 · 763 阅读 · 0 评论 -
字节序和位序(大小端)
Endianness字节序大家见得比较多,网络上论述也比较多。这里简要介绍:书写十六进制数据时,我们习惯上MSB在左,而LSB在右。LSB: least significant byteMSB: most significant byte大端:Big-endian数据在内存中(地址由低到高)的存放顺序和书写顺序是一致的。记忆方法:低地址放的是数据的MSB,所以称作大端。小端:...原创 2018-11-14 11:34:41 · 4077 阅读 · 1 评论 -
柔性数组成员 flexible array member与变长数组variable length array
柔性数组成员原创 2018-10-29 11:20:24 · 425 阅读 · 1 评论 -
C语言中可变参数的用法——va_list、va_start、va_arg、va_end
转载自1C语言可变参简介我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:int printf( const char* format, ...);除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:printf(&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;%d&amp;amp;amp;amp;amp;amp;a转载 2018-10-23 17:02:32 · 759 阅读 · 0 评论 -
C预处理器之宏展开顺序
参考自1宏展开顺序宏展开顺序大致可以归结为:第一步:首先用实参代替形参,将实参代入宏文本中第二步:如果实参也是宏,则展开实参第三步:最后继续处理宏替换后的宏文本,如果仍包含宏,则继续展开注意:如果在第二步,实参代入宏文本后,实参之前或之后遇到#或##,实参不再展开例1:#define cat(a,b) a ## b宏调用:cat(cat(1, 2), 3)的展开顺序为:cat(...原创 2018-10-25 20:18:22 · 5424 阅读 · 0 评论