详细的介绍: 一、面向过程设计中的static 1. 静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。...,而 i 的作用域为文件作用域,只能在文件A中使用,例如在文件B中: static 修饰全局变量,限制了该变量的作用域为当前文件,就是说他能在当前文件中作为全局变量被访问,但不能再其他文件中被访问,这里...静态函数 在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。...,不会发生冲突; 二、面向对象的static关键字(类中的static关键字) 1....如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针。
之前我们学过使用GCC子集之一arm-none-linux-gnueabi进行C代码编译,这次我们学习GCC另外一个子集arm-linux-androideabi,这是专门为android平台打造的一个...文件名为test.c #include int main(){ printf("hello pangshu"); return 0; } 第二步 将测试代码编译成可执行文件...如果直接编译: arm-none-linux-androideabi-gcc.exe test.c -o main 则报错,提示: clude-fixed\stdio.h:50:23: fatal error...即可,但是使用arm-linux-androideabi则不行 这里需要通过--sysroot指定依赖的库,指令改成如下: arm-none-linux-androideabi-gcc.exe --sysroot...\platforms\android-19\arch-arm test.c -o main 此时程序可正常执行 使用arm-linux-androideabi生成的可执行文件大小为6kB 使用arm-none-linux-gnueabi
: too few arguments for format 如果在attribute.c中的函数声明去掉__attribute__((format(printf,1,2))),再重新编译, 既运行$gcc...同时使用多个属性 可以在同一个函数声明里使用多个__attribute__,并且实际应用中这种情况是十分常见的。...即使__attribute__使用了多个参数,也可以很容易的使用一对圆括弧进行处理,例如: /* 如果使用的是非GNU C, 那么就忽略__attribute__ */ #ifndef __GNUC_...变量属性(Variable Attributes) 关键字__attribute__也可以对变量(variable)或结构体成员(structure field)进行属性设置。...类型属性(Type Attribute) 关键字__attribute__也可以对结构体(struct)或共用体(union)进行属性设置。
static是什么 在最开始C中引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class的概念,现在static可以修饰的对象分为以下5种: 成员变量,成员函数,普通函数,局部变量...举个例子,Student类种有一个count的变量,在使用static关键字修饰之后,所有Student的对象共用这1个count。 调用方式会发生改变,无法通过 对象名 + ....可以在一定程度上解决命名冲突的问题,不过C++提供了namespace,所以一般不用于修饰普通函数。...,而不是重新进行初始化操作 如何使用static 成员变量 通过在成员变量前面加上关键字static即可 class Studnet { private: static int count; }...static int a = 0; ++a; cout << a << endl; } 底层原理 之所以被static修饰的变量或者函数的生命周期会超越支配其所在的作用域的本质是因为它在内存中的存储位置发生了变化
C语言 inline 关键字详解1. 概述inline 关键字在C语言中引入是为了提高函数的执行效率。它告诉编译器尽量将函数的调用展开为函数体的实际代码,从而消除函数调用的开销。...用法在C语言中,使用 inline 关键字声明内联函数。...注意事项5.1 代码膨胀过多使用内联函数可能导致代码膨胀,增加可执行文件的大小。特别是在内存有限的嵌入式系统中,需要谨慎使用内联函数。...GCC 特性在使用 GCC 编译器时,可以使用 __attribute__((always_inline)) 强制内联:inline int add(int a, int b) __attribute_...总结inline 关键字是C语言中的一个有用工具,通过消除函数调用的开销来提高执行效率。然而,它并不是万能的,应该根据具体情况慎重使用,以避免代码膨胀和其他潜在问题。
本文将详细讲解宏定义的概念、使用原理,以及如何在多个源文件中共享宏定义。 1. 宏定义的概念和使用原理 1.1 宏定义的基本概念 宏定义通过 #define 指令实现,它允许我们定义常量和宏函数。...在多个文件中使用宏定义的方法 为了在多个源文件中共享宏定义,我们通常将宏定义放在一个头文件中,并在需要使用这些宏的源文件中包含这个头文件。以下是具体的步骤和示例。...2.2 在源文件中包含头文件 在每个需要使用宏的源文件中,使用 #include 指令包含头文件 macros.h。这样,源文件可以使用头文件中定义的宏。以下是两个示例源文件 a.c 和 b.c。...3.1 编译源文件 使用 gcc 编译器编译源文件: gcc -o a_program a.c gcc -o b_program b.c 解释: gcc -o a_program a.c 编译 a.c...gcc -o b_program b.c 编译 b.c 源文件,生成可执行文件 b_program。 3.2 运行程序 运行编译后的程序,查看输出结果。 运行 a.c: .
一、常用的编译器 常用编译器 : MSVC GCC MinGW CLANG ; MSVC : 微软 MicroSoft 的 VC 编译器 , Windows 开发时使用该编译器 ; GCC : Linux...中常用的编译器 , 一般嵌入式 , Linux , Android 相关的都使用该编译器 ; CLANG : MAC 中一般使用该编译器 ; MinGW : 全称 Minimalist GNU on...Windows , Windows 中使用的 GCC 编译器 ; 二、使用 Qt 中的 gcc 编译器 Qt 中的 gcc 编译器其实是 MinGW 下的编译器 ; 在之前的 【Qt】Qt 开发环境安装...下的 GCC 编译器 ; 目录 : Qt 根目录\Tools\mingw730_64\bin 将该目录配置到 Path 环境变量中 , 即可在命令行中使用 gcc 编译器 ; 命令行使用 gcc -v...gcc , 将 D:\001_Programs\013_MinGW\bin 目录配置到环境变量 Path 中 , 注意放在 Qt 的 gcc 前面 ; 执行 gcc -v 命令 , 查看版本号 ;
【如何在将arm gcc集成到MDK环境中】 ---- ?...借助 CMSIS的帮助,我们现在也可以优雅的完全使用C语言来实现芯片的启动过程。首先,我们需要获得最新的CMSIS,具体方法可以在这篇文章《CMSIS玩家的“阴间成就”指南》中获得,这里就不在赘述。...再次重申下,本文使用STM32作为例子仅仅是因为我手上有这块板子,并不是说对于STM32来说,使用GCC一定要用我说的方法而不使用官方提供好的gcc启动文件。...【如何在编译成功后打印尺寸信息】 ---- 当MDK使用Arm Compiler 5或者Arm Compiler 6进行编译,成功后会在Build Output窗口中打印一些尺寸信息,比如: ?..."))); 修改为 void SysTick_Handler(void) __attribute__ ((weak)); 注意,千万不要在startup_ARMCM7.c中为 SysTick_Handler
最近需要在nodejs上加密jwt,C#端解密jwt得到用户信息 class JwtService extends Service { encrypt(content) { const secretkey...this.app.config.jwt.key // 唯一(公共)秘钥 const cipher = crypto.createCipher('aes-128-ecb', secretkey) // 使用...utf8', 'hex') // 编码方式从utf-8转为hex; enc += cipher.final('hex')// 编码方式转为hex; return enc } } 却发现C#...端怎么也解密不了,一直报错,改了一整天,后来终于发现,nodejs端加密用的key其实在使用之前已经使用md5加密了一次,而这个操作是默认的,暂时没发现有配置可以默认去掉,服务端如果需要使用这个key解密...aes加密默认的key使用了md5加密,所以C#解密的key也要默认使用md5 MD5 md5 = new MD5CryptoServiceProvider();
怎么和我们刚开始学习C程序时说的不一样呢?从运行结果中,我们可以看出来beforeMain是在进入main函数之前被调用的,这对于C语言的初学者来说似乎有点难以理解。...而最终的可执行文件除了我们编写的这个简单的C代码以外,还有大量的C库文件参与了链接,并包含在了最终的可执行文件中。这个链接的过程,是由链接器ld的链接脚本来决定的。...如果我们没有指定链接脚本,会默认使用ld的默认脚本。...我们的例子中beforeMain函数使用的gcc扩展属性__attribute__((constructor))就是将函数对应的指令归属于.ctors section部分。...\n"); return 0; } 总结 C程序中__attribute__ ((constructor))和__attribute__ ((destructor))类似于C++类中构造函数和析构函数
在Linux系统下,可用以下指令完成源程序到目标程序的转化: gcc -o hello hello.c main.c gcc 编译器驱动程序读取源文件hello.c和main.c,经过预处理、编译、汇编...、链接(分别使用预处理器、编译器、汇编器、链接器,这四个程序构成了编译系统)四个步骤,将其翻译成可执行目标程序hello。...预处理 预处理器(CPP)根据源程序中以字符”#”开头的命令,修改源程序,得到另一个源程序,常以.i作为文件扩展名。修改主要包括#include、#define和条件编译三个方面。...可执行以下命令查看程序变化: gcc -o main.i -E main.c gcc -o hello.i -E hello.c 查看hello.i,如下图所示(main.i类似): # 1 "hello.c...运行以下指令可得到重定位目标程序main.o和hello.o: gcc -c main.s hello.s 用文本编辑器打开main.o和hello.o发现文件是乱码,因为此时已经是二进制文件。
如何在 Linux 中创建静态库 创建静态库的步骤 编写源代码: 创建一个简单的 C 文件,定义一些函数: // mathlib.c #include int add(int a,...: gcc -c mathlib.c -o mathlib.o 创建静态库: 使用 ar 工具将目标文件打包成静态库: ar rcs libmath.a mathlib.o 使用静态库: 创建一个程序来调用这个静态库...如何在 Linux 中创建动态库 创建动态库的步骤 编写源代码: // mathlib.c #include __attribute__((visibility("default"...int a, int b) { return a - b; } 编译为共享库: 使用 gcc 将代码编译为动态库: gcc -fPIC -shared mathlib.c -o libmath.so...库的跨平台使用 动态库的跨平台使用通常依赖于编译时指定的架构和平台。使用如 autoconf、CMake 等工具可以帮助开发者更好地进行跨平台构建。
比如hello.c中的第一行#include 命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入到程序文本中,结果得到了另一个C程序,通常是以.i为扩展名。...使用gcc命令: gcc -c hello.s -o hello.o 将得到hello.o文件,用vim打开看一下是如下乱码: ? 4....链接阶段 我们注意到,hello.c中有一个printf函数,它是每个C编译器都会提供的标准库中的一个函数。...最后得到hello文件,一个可执行目标文件(可执行文件),可被加载到内存中,由系统执行。使用命令: gcc hello.o -o hello 得到hello文件,内容如下: ? ...一般的编译驱动程序如GCC都实现了编译系统的所有功能,我们用编译驱动程序直接就可以实现源程序到目标文件的转化。
for (i = 0; i < s.len; i++) printf("%02x", s.data[i]); GNU C中也可以使用1个变量定义数组,例如如下代码中定义的“double x[...C99已经支持__func__宏,因此建议在Linux编程中不再使用__FUNCTION__,而转而使用__func__: void example(void) { printf("This...__attribute__ ((format (printf, 1, 2))); 上述代码中的第1个参数是格式串,从第2个参数开始都会根据printf()函数的格式串规则检查参数。...IN_DEV_ROUTE_LOCALNET(in_dev))) if (ipv4_is_loopback(saddr)) goto e_inval; 在使用gcc编译C程序的时候,如果使用...: gcc -c test.c 如果使用“-ansi–pedantic”编译选项,编译会报警: gcc -ansi -pedantic -c test.c test.c:3: warning: ISO
为了保护getString(),用到了gcc的Attributes特性: __attribute__((section ("xxx"))) 上述的文档中提到,给变量或者方法增加这个修饰后,编译器将把对应的代码或者数据放到你指定的...关于这点我们在demo中也做了验证: void init_1() __attribute__((constructor (3))); void init_getString() __attribute_...在misc/encrpt.c中,我们可以发现其核心逻辑是寻找叫做 encrypt 的 section,然后字节取反写回,同时计算将一些值计算了写入ehdr.e_entry(这个对于正常的so是0值)和ehdr.e_shoff...你可以自行使用beyond compare比较差异。 四....加密效果 使用ida打开misc/libencrypt2.so ?
而 opentelemetry-cpp 则是 opentelemetry 中对标准规范SDK的C++实现。...这种情况又不太一样,各个模块会直接使用本地的函数,不再从GOT中查找。导致各个模块最终使用的同名变量和函数地址不一样。...同时在Windows下的 GCC/Clang 中,也有对应的选项 __attribute__((selectany)) (注意 selectany 只能用于变量,不能用于函数)。...COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/.....当前版本的 opentelemetry-cpp 中,已经把单例中GCC和Clang编译时符号设置为 __attribute__((visibility("default"), weak)) 。
__关键字,它是用于设置函数属性(Function Attribute)、变量属性(Variable Attribute)、类型属性(Type Attribute)。...packed packed属性的主要目的是让编译器更紧凑地使用内存。...所以再回头看__attribute__((packed)),它的作用就是告诉编译器:取消结构体在编译过程中的优化对齐,按尽可能小的size对齐——也就是按1字节为单位对齐。...Conclusion 因此,保险的做法,iOS开发中,如果定义指令,用到非UInt8的数据类型(如UInt16, UInt32),结构体尽量用__attribute__((packed))修饰,防止数据因为对齐而导致的错位...References 深入剖析 iOS 编译 Clang LLVM 编译器 GCC中的aligned和packed属性 性能优化,要懂点编译原理 黑魔法attribute((cleanup)) ATTRIBUTE
用于在 C,C++,Objective-C 中修饰变量、函数、参数、方法、类等。 合理使用 __attribute__ 有什么好处?...这个其实是是有所偏颇的,GNU C对标准C语言进行了扩展,在GCC中,对于符号(在编译时,变量和函数都被抽象成符号)而言,存在着强符号和弱符号之分。...注意这里是声明而不是定义,既然是引用,那么就是使用其他模块中定义的实体,对于函数而言,我们可以使用这样的写法: __attribute__((weakref)) void func(void); 然后在函数中调用...我们在库中可以使用弱符号和弱引用机制,这样对于一个弱符号函数而言,用户可以自定义扩展功能的函数来覆盖这个弱符号函数。...注意:C标准里根本没有提到强、弱符号。这只是GCC这个实现定义的特性,在MS C编译器里是不存在这个概念的。 本文系网络素材,版权归原作者所有,如有侵权,请联系删除。
引言 LLVM和其他 GCC 特性一样,Clang 支持了 __attribute__, 还加入了一小部分扩展特性。...I __attribute__的应用案例 1.1 代码注入 ARM (通过汇编调用svc实现用户态到内核态的转换) // 使用inline方式将函数在调用处强制展开,防止被hook和追踪符号 static...symbol * name to its replacement */ struct rebinding {//rebinding结构体 const char *name; //符号名称,C字符串...,修改 PT_DENY_ATTACH的31,改成 任意一个值,如PT_ATTACH 0。.../onlinedocs/gcc/Function-Attributes.html
---- license: "cc-by-nc-nd-4.0" "本文从编译、二进制程序文件和运行角度逐级解析了 Linux C 语言程序中几种变量类型" 吴章金老师《360度剖析Linux ELF...这个问题则上升到 C 语言关键字 static 的用法。 static 这个关键字用来限定某个变量或者函数的作用域,这个作用域可能是文件层面,也可能是函数层面。...从语法的角度去解释某个关键字用法的文章很多,可是这些解释蛮多时候是很生硬的,不是那么好记忆。 本文尝试从实操的角度去解析 static 以及更多类型的 C 语言变量的形态。... __attribute__((weak)) char *hello = "hello"; __attribute__((weak)) void print(char *str)...小结 大学的课程蛮多都停留在语法层面的描述,需要透彻理解一些“概念”,还是需要结合实际操作,从终极使用的角度来看这些“概念”,看到的深度和细节会大有不同。