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

我最近对代码进行了一些调整,其中我不得不在函数中更改forms参数。 最初,参数类似于以下(注意,结构是之前的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引用了许多不同的function。 该信息表明“指针参数’x’(第253行)可以声明为指向const”

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

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

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

 static unsigned char my_char; static unsigned char * p_my_char; p_my_char = &my_char; int myFunction (const unsigned char * p_char) { ... } 

谢谢你的帮助!

编辑澄清 –

声明指向 const指针指向constconst指针有什么好处 – 作为forms参数 ? 我知道我可以做到,但为什么我要……尤其是在传递指针并且指向的数据未声明为常量的情况下?

将指针声明为const有什么好处 – 作为forms参数? 我知道我可以做到,但为什么我要……尤其是在传递指针并且指向的数据未声明为常量的情况下?

我以为你是指一个指向const的指针。

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

例如,看看memcpy原型:

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

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

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

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

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

Const正确性是一件很棒的事情。 首先,它让编译器帮助您避免犯错误。 一个明显的简单案例就是在你想要比较的时候进行分配。 在那种情况下,如果指针是const,编译器将给你一个错误。 谷歌“常态正确” ,你会发现许多有关它的好处的资源。

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

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

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

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