【问题标题】:Declaring a pointer to const or a const pointer to const as a formal parameter将指向 const 的指针或指向 const 的 const 指针声明为形式参数
【发布时间】:2012-02-23 18:33:40
【问题描述】:

我最近对代码进行了一些调整,其中我必须更改函数中的形式参数。最初,参数类似于以下(注意,该结构之前是 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的指针-作为形式参数有什么好处 >?我知道我可以做到这一点,但我为什么要……特别是在传递的指针和它指向的数据未声明为常量的情况下?

【问题讨论】:

    标签: c optimization embedded


    【解决方案1】:

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

    我以为你的意思是指向 const 的指针。

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

    例如看memcpy原型:

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

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

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

    【讨论】:

    • 我的意思是指向const,谢谢...当我试图澄清只是为了增加更多混乱时,我讨厌它。
    【解决方案2】:

    const 还允许向您的函数的用户表明您不会在他们背后修改此参数

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        常量正确性是一件美妙的事情。一方面,它可以让编译器帮助你避免犯错。一个明显的简单案例是在您打算比较时分配。在那种情况下,如果指针是 const,编译器会给你一个错误。 Google 'const correctness',你会发现很多关于它的好处的资源。

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 我想我应该把我的问题表述得更好一些......将指针声明为 const 作为形式参数有什么好处?我知道我可以做到这一点,但我为什么要...特别是在传递的指针和它指向的数据未声明为常量的情况下?
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-10
            • 2017-05-15
            • 1970-01-01
            • 2012-08-04
            • 2021-12-08
            相关资源
            最近更新 更多