【问题标题】:C - Which is the advantage for the user of const in parameters of functions that are not pointers?C - 在非指针函数的参数中,const 用户的优势是什么?
【发布时间】:2013-06-16 12:01:04
【问题描述】:

我想知道在调用类似函数时是否对用户有任何好处

A) void func(int i);

或类似的函数

B) void func(const int i);

在函数内部,参数 i 无论如何都会被复制到堆栈(或编译器在其优化中选择的任何位置),对于调用此函数的用户而言,A 和 B 之间没有区别。

所以如果实现类似的东西:

A)

void func(int i)
{
    i = another_func(i);
    printf("%d", i);
}

或者使用常量

B)

void func(const int i)
{
    int j = another_func(i);
    printf("%d", j);
}

我的问题:

实施 B 有什么优势吗?编译器可以执行任何类型的优化? A 和 B 只是一个简单的例子,这些问题对其他情况也有效。

我理解在指针中使用 const 的好处(例如 const void *data),因为我们告诉用户我们不会修改它的内容,但除了警告程序员之外,我不明白 const 的用法他不应该修改它的功能,但在我看来,在 API 头文件中使用 const 是没用的。

感谢您的帮助。

【问题讨论】:

    标签: c constants


    【解决方案1】:

    这里有人说如果你不改变变量你应该写const——因为你可以声明任何局部变量const。 (主要目的是防止你意外改变变量,也可以帮助编译器优化你的代码)

    其他人说你不应该声明函数参数const,因为它会暴露API中的一些实现。

    我认为他们俩都是对的!这就是为什么你可以在函数声明中省略const:你可以在头文件中写void func(int);,但在代码文件中实现void func(const int i) {}

    【讨论】:

      【解决方案2】:

      这是对程序员的警告,是的。但这不仅仅是一个警告。编译器通过确保程序员不会无意中修改值来强制执行 const-ness。在那里,它是一种编码 API 和算法设计信息的方法。并且由于在嵌套函数调用中保证了 const-ness,因此它在整个调用链中都得到了保留。请注意,在调用链中的某个点,也有人可能使用指向 const 值的指针。

      编译器还使用 const-ness 进行优化。这是good answer

      【讨论】:

      • 但是由于参数是按值传递的,所以我可以用const int参数调用void func(int);
      • 但是当 const 在参数中时,这些类型的优化不适用,正如 Luc Touraille [在您发送的链接中][1] [1] 所解释的那样:stackoverflow.com/questions/212237/…
      【解决方案3】:

      在外部函数的非指针类型参数中不使用const 至少有一个原因。使用const,您将暴露 API 的内部结构,这与 API 用户无关。

      const 的使用通常有助于优化,但它的主要用途是防止错误和记录 API。

      【讨论】:

      • 你可以不用const(在API中)声明函数,用const定义。
      【解决方案4】:

      将其声明为const 还可以防止 或使用相同代码的其他开发人员在您编写函数时对其进行修改。这是一种防御性编程技术,它清楚地表明该参数不应该被修改,也许当您在六个月后返回代码时,通过在函数中懒惰地将输入参数用于其他目的来防止您采用可以说是坏习惯,有助于防止因无意中混淆=== 等而引起的严重错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        相关资源
        最近更新 更多