【问题标题】:Use of 'const' for function parameters对函数参数使用“const”
【发布时间】:2010-09-12 03:36:42
【问题描述】:

const 你能走多远?您只是在必要时创建函数const,还是全力以赴并在任何地方使用它?例如,假设一个简单的 mutator 接受一个布尔参数:

void SetValue(const bool b) { my_val_ = b; }

const 真的有用吗?我个人选择广泛使用它,包括参数,但在这种情况下我想知道它是否值得?

我还惊讶地发现,您可以在函数声明的参数中省略 const,但可以将其包含在函数定义中,例如:

.h 文件

void func(int n, long l);

.cpp 文件

void func(const int n, const long l)

这是有原因的吗?这对我来说似乎有点不寻常。

【问题讨论】:

  • 我不同意。 .h 文件也必须具有 const 定义。如果没有,那么如果将 const 参数传递给函数,编译器将产生错误,因为 .h 文件中的原型没有 const 定义。
  • 我同意。 :-) (有问题,而不是最后一条评论!)如果不应该在函数体中更改值,这可以帮助阻止愚蠢的 == 或 = 错误,你不应该在两者中都放 const,(如果它是按值传递的,否则你必须这样做)不过还不足以引起争论!
  • @selwyn:不过,即使您将 const int 传递给函数,它也会被复制(因为它不是引用),因此 const 并不重要。
  • 这个问题发生了同样的争论:stackoverflow.com/questions/1554750/…
  • 我意识到这篇文章已经有几年了,但作为一个新程序员,我很想知道这个问题,我偶然发现了这个对话。在我看来,如果一个函数不应该改变一个值,无论是引用还是值/对象的副本,它都应该是 const。它更安全,它是自记录的,而且它对调试更友好。即使对于只有一个语句的最简单的函数,我仍然使用 const。

标签: c++ constants


【解决方案1】:

作为需要使用具有 50 多个公开函数的 C++ 程序以及偶尔使用 const 限定符的 .h 文件的 VB.NET 程序员,很难知道何时使用 ByRef 或 ByVal 访问变量。

当然程序会在你出错的那一行生成一个异常错误来告诉你,但是你需要猜测2-10个参数中哪个是错误的。

所以现在我有一个令人讨厌的任务,试图说服开发人员他们应该真正定义他们的变量(在 .h 文件中),以允许轻松创建所有 VB.NET 函数定义的自动化方法。然后他们会沾沾自喜地说:“阅读……文档。”

我编写了一个解析 .h 文件并创建所有 Declare Function 命令的 awk 脚本,但没有指示哪些变量是 R/O 与 R/W,它只完成了一半的工作。

编辑:

在另一位用户的鼓励下,我添加了以下内容;

这是一个 (IMO) 格式不正确的 .h 条目的示例;

typedef int (EE_STDCALL *Do_SomethingPtr)( int smfID, const char* cursor_name, const char* sql );

我的脚本生成的 VB;

    Declare Function Do_Something Lib "SomeOther.DLL" (ByRef smfID As Integer, ByVal cursor_name As String, ByVal sql As String) As Integer

注意第一个参数中缺少的“const”。没有它,程序(或其他开发人员)就不知道第一个参数应该传递“ByVal”。通过添加“const”,它可以使 .h 文件自我记录,以便使用其他语言的开发人员可以轻松编写工作代码。

【讨论】:

  • @anatolyg,你说得对,这是一个咆哮,但它确实确定了在可能不需要的语言中没有正确使用概念的问题,但提供了可用性和自我文档。如果您正在编写需要其他开发人员使用的代码,那么使其可用很重要。如果有人觉得它有用,我很乐意发布 AWK 脚本,但它只有在 .h 文件格式正确时才有效。
  • 为了说明您的观点,您最好发布一个不好的*.h 示例和一个好的示例。还有翻译后的文件,并显示脚本有问题的地方,以及如果你在适当的地方使用const,问题是如何消失的。
  • @anatolyg,这样更好吗?
  • 至少现在我明白你想说什么了!但我不同意:int smfIDconst int smfID 在 C++ 中均表示“按值传递”,而 int& smfID 表示“按引用传递”。
  • @anatolyg .h 文件中没有“&”,这些参数似乎可互换用于 ByRef/ByVal。我发现的唯一方法是搜索 .CHM 文件文档,或者等到我的程序因“System.AccessViolationException”错误而崩溃并尝试找出它是哪个参数。我目前使用的特定 dll 有大约 100 个公共方法,我想自动创建“声明函数”。
猜你喜欢
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2023-03-20
相关资源
最近更新 更多