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

时间:2016-01-13 18:47:20

标签: c embedded const

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

第一个:

typedef const struct process_data
{
   uint8_t *name;
   void (*p_func)(void);
} process_data_t;

process_data_t processes = {15,16};

第二个是:

typedef struct process_data
{
   uint8_t *name;
   void (*p_func)(void);
} process_data_t;

const process_data_t processes = {15,16};

请注意,const限定符已从typedefing移至结构定义。对我来说,两个摘录之间没有区别,但编译器/链接器统计数据表明,当使用第二段代码时,消耗的闪存(平台是具有受限资源的微控制器)就会消耗掉。

3 个答案:

答案 0 :(得分:4)

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

  • typedef"表示":这是一种始终为const的类型,这意味着没有"合法"如何删除此类型的任何变量的const - nes。无论何时传递此类型的数据或指向它的指针,它们都将是const。当然,铸造"工作",但仅限于另一种类型,并可能导致未定义的行为。

  • const数据"表示":此数据为const,但此类型的其他数据可能不是,因此,至少有一些& #34;带走const - nes"在这种类型的变量和指针之间是可以的。当然,如果有人将指向这些数据的指针转换为非const并且它确实在只读内存中,那么我们就会遇到麻烦。

所以,底线是一样的,但有一个细微的差别。编译器如何解释这完全取决于编译器。很可能typedef非常罕见(根据我的经验),所以编译器针对更常见的情况进行了优化。

答案 1 :(得分:3)

声明为const的数据定义与常规const ness之间存在差异,因为如果您从const抛弃const_cast,它将成为未定义的行为(至少在C ++中)使用限定符定义的对象。

在语言律师之外,理由显而易见:我们希望这些作为只读图像的一部分,同时仍允许知道自己正在做什么的人使用$(document).ready(function() { // Catch all clicks on a link with the class 'link' $('.link').click(function(e) { // Stop the link being followed: e.preventDefault(); // Get the div to be shown: var content = $(this).attr('rel'); // Remove any active classes: $('.active').removeClass('active'); // Add the 'active' class to this link: $(this).addClass('active'); // Hide all the content: $('.content').hide(); // Show the requested content: $('#' + content).show(); }); ,因为 $to = "me@mywebsite.com"; $subject = "Inquiry"; $name = $_POST['name'] ; $email = $_POST['email'] ; $phone = $_POST['phone'] ; $mailsend = mail ('$to', '$subject',"Name: $name\r\nEmail: $emial\r\nPhone: $phone\r\n" ); if ($mailsend) { echo "Hello $name . Lorem ipsum est un divagat de pleure malucate";} else { echo "ERROR sending";} 3}}也是如此。

在C中,我们有相同的动机:将常量放入只读内存,但允许强制转换工作。当限定符附加到类型时,这并不是用户希望变量转到只读内存的强有力保证,因此编译器可能会在此处谨慎行事。

答案 2 :(得分:0)

consts存储在只读存储器中 - 我的猜测是你只是在移动数据的位置。如果没有更多信息,很难说100%。