【发布时间】:2016-09-16 09:38:10
【问题描述】:
请参阅以下程序。
#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\n", a);
}
在这个程序中,函数f() 的声明与定义不完全匹配。声明有int a作为参数,但定义有const int a作为参数。
这是我对这个程序的问题。
- 我相信这没问题,因为调用
f()的代码不必知道实际参数a是否在f()中被视为常量。那一点细节是f()私有的。这与调用代码无关。就调用者而言,在任何一种情况下调用f()时,对其可见的int a的任何内容都不会改变。我说的对吗? - 在函数定义中将实际参数声明为
const int或const char *const但在标头中将它们声明为int或const char *是否常见?如果没有,你推荐这种方式吗?为了使第二个问题保持客观,请列出这样做的利弊。
【问题讨论】:
-
不,这不太好。这应该给出警告,因为实现与声明不同。
-
@MichaelWalz:Clang 和 GCC 都没有对此发出警告,即使在
-std=c11 -pedantic -Wall -Wextra。 -
@MichaelWalz 据我了解,
f(const int a)和f(int a)对调用者的含义相同,即在任何一种情况下,f()都无法更改调用者可以看到的关于a的任何内容.另外,我用gcc -Wall -Wextra -pedantic -std=c99 foo.c编译。没有警告。 -
你的编译器没有显示警告吗?
-
@MichaelWalz 这个代码是正确的
标签: c arguments parameter-passing constants