由于我的编译器为这两段代码提供了不同的统计信息,我想知道是什么让它们与众不同(如果有的话)?
第一个:
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移至结构定义。对我来说,两个摘录之间没有区别,但编译器/链接器统计数据表明,当使用第二段代码时,消耗的闪存(平台是具有受限资源的微控制器)就会消耗掉。
答案 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%。