我最近对代码做了一些调整,其中我不得不在函数中更改形式参数。最初,参数类似于以下(注意,结构是之前的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
- ,有什么好处形式参数?我知道我可以这样做,但为什么我要......尤其是在传递指针并且它指向的数据未声明为常量的情况下?
答案 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 *
,则需要小心。