【发布时间】:2017-09-22 21:11:18
【问题描述】:
是否向标准允许的函数参数添加额外的 const 说明符,如下所示?
foo.h:
int foo(int x, char * data);
foo.c:
// does this match the prototype?
int foo(const int x, char * const data) {
// this implementation promises not to change x or move data inside the function
}
GCC 通过-std=c99 -Wpedantic -Wall -Werror 接受它,但这不一定与标准兼容。
This answer 表明 C++ 标准允许这样做 - C (99) 标准是否也允许这样做?
【问题讨论】:
-
这是一个有趣的问题,但我认为允许它不是一个好主意,如果是,那就不好了。为什么您希望您的定义与声明不匹配?它只会让代码更加混乱。
-
它是允许的(参见“§compatible types”,但非常糟糕的做法。这样的代码可能会被专业人士拒绝,因为它可能存在其他缺陷(永远不会只有一只蚂蚁)。它也可能会混淆像 Doxygen 这样的常用工具。那么,支持@savram 到底为什么要这样做?
-
因为函数原型不应该包含实现细节,参数是否为
const是一个实现细节。根据this answer,Herb Sutter 的 Exceptional C++ 实际上建议您这样做。 -
可以说真正的问题不是为什么语言允许你在声明中省略
const,而是为什么它允许你把它放在那里。对于声明的消费者来说,这充其量只是毫无意义的噪音。在最坏的情况下,这是在声明外部函数时出错的一种方式。