c - 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

标签 c coding-style constants static-analysis

当我们在头文件中有原型(prototype)时,我们的静态分析工具会提示“返回类型上的类型限定符无用”,例如:

const int foo();

我们这样定义它是因为该函数返回一个永远不会改变的常量,认为使用 const 后 API 看起来更清晰。

为了清楚起见,我觉得这类似于将全局变量显式初始化为零,尽管 C 标准已经声明如果没有显式初始化,所有全局变量都将被初始化为零。归根结底,这真的无关紧要。 (但是静态分析工具并没有提示。)

我的问题是,这是否会导致问题?我们应该忽略该工具产生的错误,还是应该以不太清晰和一致的 API 为代价来安抚该工具? (它返回工具没有问题的其他 const char* 常量。)

最佳答案

您的代码通常最好尽可能准确地描述正在发生的事情。您收到此警告是因为 const int foo(); 中的 const 基本上没有意义。如果您不知道 const 关键字的含义,API 只会显得更清晰。不要那样重载意义; static 就这样已经够糟糕了,没有理由增加更多困惑的可能性。

const char * 的含义与 const int 不同,这就是为什么您的工具不会提示它。前者是指向常量字符串的指针,这意味着任何调用返回该类型的函数的代码都不应尝试修改字符串的内容(例如,它可能在 ROM 中)。在后一种情况下,系统无法强制您不对返回的 int 进行更改,因此限定符没有意义。与返回类型更接近的是:

const int foo();
char * const foo2();

这都会导致您的静态分析发出警告 - 向返回值添加 const 限定符是无意义的操作。只有当您有一个引用参数(或返回类型)时才有意义,例如您的 const char * 示例。

其实我只是做了一个小测试程序,GCC竟然明确警告了这个问题:

test.c:6: warning: type qualifiers ignored on function return type

所以不仅仅是您的静态分析程序在提示。

关于c - 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579435/

相关文章:

C++风格: Stroustrup' s placement of pointer asterisks

C - 函数参数和 "<<"运算符

c - 为什么内存会损坏?

有人可以帮我理解这个程序吗?

C 字符串函数可以工作,但在多次调用 malloc 后会失败

actionscript-3 - AS3 中的隐式与显式 getter/setter,使用哪个以及为什么?

c++ - 使用 'for' 循环遍历 C++ vector

有人能告诉我这个 C 程序做错了什么吗?

c++ - 为什么 std::vector 不能保存常量对象?

c++ - const ref lvalue to non-const func return value 是否专门减少拷贝?