这两个表达式之间有区别吗?

Hai*_*iri 13 c embedded const

由于我的编译器为这两段代码提供了不同的统计信息,我想知道是什么让它们与众不同,如果有的话?

第一:

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移动到结构的定义.对我来说,两个摘录之间没有区别,但编译器/链接器统计信息表明,当使用第二段代码时,会消耗更少的闪存(平台是具有受限资源的微控制器).

srd*_*vic 5

编译器在解释这些声明时可以有一定的自由度,但总的来说,区别如下:

  • typedef说”:这是一种始终为 的类型const,这意味着没有“合法”方法可以消除该类型的任何const变量的 -nes 。每当您传递这种类型的数据或指向它的指针时,它们都将是 const。当然,强制转换“有效”,但仅限于另一种类型,并且可能会导致未定义的行为。

  • 数据const“说”:这个数据是const,但是,这种类型的其他数据可能不是,因此,在这种类型的变量和指针之间至少有一定量的“带走const-nes”是可以的。当然,如果有人将指向该数据的指针转换为非常量,并且它确实位于只读内存中,那么我们就有麻烦了。

因此,底线是相同的,但有细微的差别。编译器如何解释这实际上取决于编译器。这种情况很可能typedef非常罕见(根据我的经验),因此编译器针对更常见的情况进行了优化。