当我们在头文件中有原型时,我们的静态分析工具会抱怨“返回类型上的无用类型限定符”,例如:
const int foo();我们这样定义它是因为函数返回一个永远不会改变的常量,认为有了const,应用编程接口似乎更清晰。
为了清晰起见,我觉得这类似于显式地将全局变量初始化为零,即使C标准已经声明,如果不显式初始化,所有全局变量都将被初始化为零。说到底,这真的无关紧要。(但静态分析工具不会抱怨这一点。)
我的问题是,有没有理由这样做会导致问题?我们应该忽略工具产生的错误,还是应该以不太清晰和一致的API为代价安抚工具?(它返回该工具没有问题的其他const char*常量。)
发布于 2009-10-16 17:52:40
对于你的代码来说,尽可能准确地描述正在发生的事情通常是更好的。您会收到此警告,因为const int foo();中的const基本上没有任何意义。只有当您不知道const关键字的含义时,该应用程序接口才显得更加清晰。不要重载这样的含义;static已经足够糟糕了,没有理由增加更多混淆的可能性。
const char *的含义与const int有所不同,这就是您的工具不会抱怨它的原因。前者是一个指向常量字符串的指针,这意味着任何调用返回该类型的函数的代码都不应该试图修改字符串的内容(例如,它可能在ROM中)。在后一种情况下,系统无法强制您不对返回的int进行更改,因此限定符是没有意义的。与返回类型更相似的是:
const int foo();
char * const foo2();这都会导致您的静态分析给出警告-将常量限定符添加到返回值是一个无意义的操作。只有当你有一个引用参数(或返回类型)时,它才有意义,就像你的const char *例子。
其实我刚刚做了一个小测试程序,对于这个问题,GCC甚至明确提出了警告:
test.c:6: warning: type qualifiers ignored on function return type所以不仅仅是你的静态分析程序在抱怨。
发布于 2009-10-16 17:51:09
您可以使用不同的技术来说明您的意图,而不会让工具感到不快。
#define CONST_RETURN
CONST_RETURN int foo();使用const char *没有问题,因为它声明的是指向常量字符的指针,而不是常量指针。
发布于 2009-10-16 18:14:25
现在忽略const,foo()返回值。你可以做到
int x = foo();并将foo()返回的值赋给变量x,方法与您可以执行的操作大致相同
int x = 42;将值42赋值给变量x。
但您不能更改42 ...或foo()返回的值。通过将const关键字应用于foo()类型来声明从foo()返回的值不能更改,这样做什么也做不到。
值不能为const (或restrict__或volatile)。只有对象才能有类型限定符。
与之对比
const char *foo();在这种情况下,foo()返回一个指向对象的指针。返回值指向的对象可以是限定的const。
https://stackoverflow.com/questions/1579435
复制相似问题