
C/C++
分享C或者C++ 遇到的各种问题
weixin_44799641
这个作者很懒,什么都没留下…
展开
-
要引用一个文件中的 函数 是使用 extern 好还是包含头文件好?
原理:通过 #include 指令将头文件包含到当前源文件中,编译器会将头文件的内容插入到 #include 指令所在的位置,从而使当前源文件可以访问头文件中声明的函数、变量和类型等。灵活引用:当你只需要引用文件中的个别函数,不想引入整个头文件时,使用 extern 可以更精准地引用所需函数,避免引入不必要的定义和声明,减少编译时间和命名冲突的可能性。自动更新:当函数的原型发生变化时,只需要修改头文件中的声明,所有包含该头文件的源文件都会自动更新,无需手动修改每个源文件中的 extern 声明。原创 2025-04-16 09:17:39 · 827 阅读 · 0 评论 -
va_start ( va_args, Flow ); va_end ( va_args ); 有什么作用?
va_end 用于结束对可变参数的访问。在函数使用完可变参数后,调用 va_end 来清理 va_list 相关的内部状态,比如将指针恢复到合适状态,防止出现内存泄露、堆栈损坏等潜在问题 ,确保程序的稳定性和安全性。通过这个参数,va_start 能确定可变参数在堆栈中的起始位置,让 va_list 类型变量指向可变参数列表的第一个参数,为后续使用 va_arg 宏获取可变参数做准备。va_start 用于初始化 va_list 类型的变量(这里是 va_args ) ,以便后续访问可变参数列表。原创 2025-04-11 09:48:17 · 444 阅读 · 0 评论 -
在.c 和 .h 文件中都对 USART_IOCtl() 函数添加 extern 修饰
声明与定义的区别:在 C 语言里,声明是告诉编译器某个标识符(函数、变量等)的存在及类型等信息,不分配内存;定义则是为标识符分配内存空间,对于函数来说就是实现函数体。在 .h 文件中用 extern 声明 USART_IOCtl 函数,是为了让包含该头文件的其他源文件知道有这么个函数及它的参数和返回值类型,这是合理的。usart.c 中的 extern 多余性:在 usart.c 中,既然已经是函数定义(有函数体实现),函数本身就已经确定其存在性了,不需要 extern 来再次强调它是外部链接属性。编译器在原创 2025-04-11 09:02:34 · 722 阅读 · 0 评论 -
对一个32位整型数进行逆序,如:0x11223344变为0x44332211
该宏定义可以对一个,32位整型数进行逆序。原创 2025-04-03 16:35:37 · 306 阅读 · 0 评论 -
#define LWIP_U32_DIFF(a, b) ((a) >= (b)? ((a) - (b)) : ((~(b) + (a)) + 1)),a 和b 都是无符号数,求结果?
不同版本的 LWIP 中,LWIP_U32_DIFF 的具体实现可能会有所不同,但基本功能都是为了正确计算两个无符号 32 位整数的差值并处理溢出情况。在 LWIP(轻量级网络协议栈)中,LWIP_U32_DIFF 通常是用于计算两个无符号 32 位整数差值的宏(macro)。原创 2025-04-03 14:02:01 · 564 阅读 · 0 评论 -
uint8_t TxBuffer[8]={0}; memset(TxBuffer,0,sizeof(TxBuffer)) 初始化数组 哪个方式比较好?
此外,它可以把内存块设置为除 0 以外的其他值(尽管对于非字符类型的数组,设置非 0 值可能会产生意想不到的结果)。若在数组定义之后的某个时刻才需要初始化:使用 memset(TxBuffer, 0, sizeof(TxBuffer));,它代码简洁,并且在编译阶段完成初始化,没有运行时开销。该操作在程序运行时执行。适用场景:适用于在数组定义之后的某个时刻进行初始化,或者需要对已经存在的内存块进行重置操作的情况。性能:由于是运行时函数调用,会有一定的函数调用开销,不过在现代处理器上,这种开销通常较小。原创 2025-04-01 11:09:56 · 366 阅读 · 0 评论 -
共享位图 是什么?如 static vu32 shareBitMap[4] = {0,0,0,0};
共享位图 */ 是一个注释,其作用是对后续代码进行解释说明,表明 shareBitMap 数组的用途是作为共享位图。内部链接属性:若该代码处于源文件(.c 文件)里,static 会让 shareBitMap 具有内部链接属性,这意味着该数组仅能在定义它的源文件内部使用,其他源文件无法通过外部链接来访问它。对数组进行初始化,让数组的 4 个元素都初始化为 0。在这个示例里,shareBitMap 数组被当作共享位图使用,通过 set_bit 函数设置某一位,通过 check_bit 函数检查某一位的状态。原创 2025-03-29 16:58:41 · 368 阅读 · 0 评论 -
宏定义 放在 一个结构体中 合适吗?
违背设计意图:宏定义的目的是为了提供全局或局部的常量、代码片段替换等功能,而结构体的目的是组织数据。结构体:结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个新的数据单元。作用域混淆:宏定义的作用域是文件范围,而结构体成员的作用域是结构体内部。将宏定义放在结构体中会导致作用域概念的混淆,使得代码的逻辑难以理解。如果宏定义与结构体相关,可以将宏定义放在结构体定义之前或者包含该结构体定义的头文件中。综上所述,不建议把宏定义放在结构体中,应根据宏定义的使用范围和目的,将其放在合适的位置。原创 2025-03-29 16:40:14 · 418 阅读 · 0 评论 -
宏定义一般是放在什么位置 ?
这样,不同的源文件只需包含该头文件,就可以使用其中定义的宏,提高了代码的复用性和可维护性。适用场景:如果宏定义仅在某个源文件内部使用,不希望被其他文件访问,那么将其放在该源文件的开头部分是合适的。适用场景:对于一些大型项目,通常会有专门的配置文件来管理项目的各种配置信息,宏定义也可以放在这里。头文件:适用于需要在多个源文件中共享的宏定义。源文件:适用于仅在单个源文件中使用的宏定义。配置文件:适用于管理项目的配置信息的宏定义。// 仅在 main.c 中使用的宏。// 定义一个通用的常量宏。原创 2025-03-29 16:31:33 · 464 阅读 · 0 评论 -
在 C 和 C++ 编程里,要引用一个文件中的函数,包含头文件和使用extern,通常包含头文件是更好的做法
综上所述,通常建议通过包含头文件来引用其他文件中的函数,这样能提高代码的可维护性和可读性。只有在特殊情况下,才考虑使用 extern 关键字直接声明函数。使用 extern 关键字。原创 2025-03-19 11:29:51 · 426 阅读 · 0 评论