9

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

A) 无效函数(int i);

或类似的功能

B) 无效函数(const int i);

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

因此,如果实现类似:

A)

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

或使用 const

B)

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

我的问题 :

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

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

谢谢你的帮助。

4

4 回答 4

7

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

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

我觉得他们俩都是对的!这就是你可以省略constin 函数声明的原因:你可以写void func(int);在头文件中,但void func(const int i) {}在代码文件中实现它。

于 2013-06-16T13:26:03.443 回答
3

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

编译器还使用 const-ness 进行优化。这是一个很好的答案

于 2013-06-16T13:06:07.897 回答
2

至少有一个原因为什么不在const外部函数的非指针类型参数中使用。随着const您暴露 API 的内部,这应该与 API 用户无关。

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

于 2013-06-16T12:04:20.483 回答
1

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

于 2013-06-16T12:58:40.423 回答