声明指向const的指针或指向const的const指针作为形式参数

时间:2012-02-23 18:33:41

标签: c optimization embedded

我最近对代码做了一些调整,其中我不得不在函数中更改形式参数。最初,参数类似于以下(注意,结构是之前的typedef):

static MySpecialStructure my_special_structure;
static unsigned char char_being_passed;              // Passed to function elsewhere.
static MySpecialStructure * p_my_special_structure;  // Passed to function elsewhere.

int myFunction (MySpecialStructure * p_structure, unsigned char useful_char)
{
    ...
}

进行更改是因为我可以在编译时定义和初始化my_special_structure,而myFunction从未更改它的值。这导致了以下变化:

static const MySpecialStructure my_special_structure;
static unsigned char char_being_passed;              // Passed to function elsewhere.
static MySpecialStructure * p_my_special_structure;  // Passed to function elsewhere.

int myFunction (const MySpecialStructure * p_structure, unsigned char useful_char)
{
    ...
}

我还注意到,当我在程序上运行Lint时,有几个Info 818引用了许多不同的功能。信息表明“指针参数'x'(第253行)可以声明为指向const”

现在,关于上述问题,我有两个问题。首先,关于上面的代码,既然指针和MySpecialStructure中的变量都没有在函数内改变,那么将指针声明为常量也是有益的吗?例如 -

int myFunction (const MySpecialStructure * const p_structure, unsigned char useful_char)

我的第二个问题是关于Lint信息。如果函数没有改变它的值,将指针声明为常量形式参数是否有任何好处或缺点...即使传递给函数的内容从未被声明为常量?例如 -

static unsigned char my_char;
static unsigned char * p_my_char;
p_my_char = &my_char;

int myFunction (const unsigned char * p_char)
{
    ...
}

感谢您的帮助!

编辑澄清 -

指针指向const const指针指向const - ,有什么好处形式参数?我知道我可以这样做,但为什么我要......尤其是在传递指针并且它指向的数据未声明为常量的情况下?

6 个答案:

答案 0 :(得分:9)

  

将指针声明为const有什么好处 - 作为形式参数?我知道我可以做到,但为什么我要......特别是在传递指针并且指向的数据未声明为常量的情况下?

我认为你是指向const的指针。

通过指向const作为参数,优点是通过告诉程序员您的函数不会修改指针所指向的对象来记录API。

例如,查看memcpy原型:

void *memcpy(void * restrict s1, const void * restrict s2, size_t n);

它告诉程序员s2指向的对象不会通过memcpy调用进行修改。

它还提供编译器强制文档,因为如果从指针const修改指针,实现将发出诊断。

答案 1 :(得分:3)

如果将形式参数声明为const,编译器可以检查您的代码是否不会尝试修改该参数,从而提高软件质量。

答案 2 :(得分:3)

const还允许指示您的函数用户不会在其背后修改此参数

答案 3 :(得分:2)

对于你的第一个问题,如果你确定不修改它指向的指针或变量,你可以通过任何方式继续使它们都保持不变!

现在,对于你的Qn,为什么将正式指针参数声明为const,即使传递的指针不是常量,典型的用例是库函数printf()printf应该接受const char *,但即使您向char*传递printf(),编译器也不会抱怨。在这种情况下,printf()不会构建用户的错误并且无意中更改用户的数据是有道理的!就像const char *清楚地说明一样 - 无论您是通过char*还是const,请不要担心,我仍然不会修改您的数据!

对于第二个问题,{{1}}指针在嵌入式世界中找到了很好的应用程序,我们通常直接写入内存地址。 Here是详细解释

答案 4 :(得分:2)

Const正确性是一件很棒的事情。首先,它让编译器帮助您避免犯错误。一个明显的简单案例就是在你想要比较的时候进行分配。在那种情况下,如果指针是const,编译器将给你一个错误。 Google 'const correctness'你可以找到很多关于它的好处的资源。

答案 5 :(得分:1)

那么,当您可以选择不这样做时,将const声明为什么有什么好处?毕竟,如果你不触摸它,它是const是不是无关紧要。这提供了编译器可以为您执行的一些安全检查,并提供了函数接口的一些信息。例如,您可以安全地将字符串文字传递给期望const char *的函数,但如果参数声明为char *,则需要小心。