C/C++应避免的一些坑和问题

#define SPI_BUFFER_SIZE  4*1024

for (uint16_t i = 0; i <( Size / SPI_BUFFER_SIZE); i++)
//由于宏定义是直接替换,所以
 i< ( Size / SPI_BUFFER_SIZE) 实际是
 i< ( Size / 4 * 1024)  //  * /是同级运算
 //后者往往不是我们想要的结果

为了避免这种情况 最好宏定义时最好不带运算符 或者加上括号

#define SPI_BUFFER_SIZE  4096 //(4*1024)
  1. 三目运算符中自增bug
    编译警告:operation on ‘index’ may be undefined
    
    index= ((index<=3)?(index++):0);
更改为:
	index++;
	  index=((index<=3)?index:0);
或者
  index=((index<=3)?index+1:0);

关于头文件中的static inline函数

头文件中的 static inline 函数具有特殊的属性,它们的设计意图是为了允许在多个编译单元中“内联”地重复定义,同时限制函数的可见性以避免链接时的多重定义错误。这里的关键词是:

static: 通常情况下,在C/C++中,static 用于限制函数或变量的作用域,使其只在定义它的翻译单元(通常是源文件)内可见。然而,当 static 与 inline 一起用于函数定义时,它改变了语义,允许该函数在头文件中定义,并且当该头文件被多个源文件包含时,不会导致多重定义错误。这是因为每个编译单元都会得到自己的“私有”副本,且由于是 inline 函数,编译器可能会选择内联展开该函数调用,从而避免了实际的函数调用开销。

inline: 这个关键字建议编译器尝试在调用点展开函数的代码,而不是执行常规的函数调用。这样可以减少函数调用的开销,提升程序的运行效率。但是,是否真正内联是由编译器决定的,编译器可能会基于多种因素(如函数体的大小、优化级别等)忽略此建议。

综上所述,头文件中的 static inline 函数可以在外部被调用,而且正是为了能够在多个地方调用并可能内联展开而设计的。不过,由于 static 的作用,这些函数的定义在链接阶段不会引起冲突,每个使用它的编译单元都像是拥有该函数的一个独立实例,尽管它们可能共享相同的实现。

你可能感兴趣的:(#,C,c++,c语言,c#)