由于我的编译器为这两段代码提供了不同的统计信息,我想知道是什么让它们与众不同,如果有的话?
第一:
typedef const struct process_data
{
uint8_t *name;
void (*p_func)(void);
} process_data_t;
process_data_t processes = {15,16};
Run Code Online (Sandbox Code Playgroud)
第二个是:
typedef struct process_data
{
uint8_t *name;
void (*p_func)(void);
} process_data_t;
const process_data_t processes = {15,16};
Run Code Online (Sandbox Code Playgroud)
请注意,const
限定符已从typedefing移动到结构的定义.对我来说,两个摘录之间没有区别,但编译器/链接器统计信息表明,当使用第二段代码时,会消耗更少的闪存(平台是具有受限资源的微控制器).
编译器在解释这些声明时可以有一定的自由度,但总的来说,区别如下:
“typedef
说”:这是一种始终为 的类型const
,这意味着没有“合法”方法可以消除该类型的任何const
变量的 -nes 。每当您传递这种类型的数据或指向它的指针时,它们都将是 const。当然,强制转换“有效”,但仅限于另一种类型,并且可能会导致未定义的行为。
数据const
“说”:这个数据是const
,但是,这种类型的其他数据可能不是,因此,在这种类型的变量和指针之间至少有一定量的“带走const
-nes”是可以的。当然,如果有人将指向该数据的指针转换为非常量,并且它确实位于只读内存中,那么我们就有麻烦了。
因此,底线是相同的,但有细微的差别。编译器如何解释这实际上取决于编译器。这种情况很可能typedef
非常罕见(根据我的经验),因此编译器针对更常见的情况进行了优化。