#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)
- 三目运算符中自增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 的作用,这些函数的定义在链接阶段不会引起冲突,每个使用它的编译单元都像是拥有该函数的一个独立实例,尽管它们可能共享相同的实现。