是否可以将实际参数定义为`const int`,但在头文件中将其声明为`int`?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以将实际参数定义为`const int`,但在头文件中将其声明为`int`?相关的知识,希望对你有一定的参考价值。

请参阅以下程序。

#include <stdio.h>

void f(int a);

int main()
{
  f(10);
  return 0;
}

void f(const int a)
{
  /* a = 20; */ /* Want to avoid accidental modification of a. */
  printf("%d
", a);
}

在这个程序中,函数f()的声明与定义不完全匹配。该声明以int a为参数,但定义以const int a为参数。

以下是关于此计划的问题。

  1. 我相信这是可以的,因为调用f()的代码不必知道实际参数a是否在f()中被视为常量。这一点细节是f()私有的。这不是调用代码的关注点。就调用者而言,在任何一种情况下,在调用int a时,对于它可见的f()都不会改变。我对吗?
  2. 将函数定义中的实际参数声明为const intconst char *const是常见的,但是在标题中将它们声明为intconst char *?如果没有,你推荐这种方式吗?为了保持第二个问题的目标,请列出这样做的利弊。
答案

一些软件公司坚持在可能的情况下标记函数参数const,因为有一种思想可以表明你的函数更稳定(并且不易受到错误的重构),如果你这样做,因为你不能无意中修改输入参数。

C标准允许您在函数声明中使用非const参数,在定义中使用const

就个人而言,我不这样做,因为我喜欢我的原型以符合我的定义。我想你也可能会混淆代码分析包。

以上是关于是否可以将实际参数定义为`const int`,但在头文件中将其声明为`int`?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要将默认引用参数定义为 const 以便我可以为其分配左值? [复制]

error C2664: “int CWnd::MessageBoxW(LPCTSTR,LPCTSTR,UINT)”: 无法将参数 1 从“const char [9]”转换为“LPCTSTR”

在Qt中如何将QString转换为const char*

C++中强行修改const常量的问题

为什么可以将int []作为通用类型参数,但不能将int作为常规类型参数? [关闭]

将数组作为 C++ 中方法的 const 参数传递