为了清楚起见,是否应该在返回类型上使用无用的类型限定符? [英] Should useless type qualifiers on return types be used, for clarity?

查看:42
本文介绍了为了清楚起见,是否应该在返回类型上使用无用的类型限定符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我们在以下头文件中有原型时,我们的静态分析工具会抱怨返回类型上无用的类型限定符":

Our static analysis tool complains about a "useless type qualifier on return type" when we have prototypes in header files such as:

const int foo();

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

We defined it this way because the function is returning a constant that will never change, thinking that the API seemed clearer with const in place.

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

I feel like this is similar to explicitly initializing global variables to zero for clarity, even though the C standard already states that all globals will be initialized to zero if not explicitly initialized. At the end of the day, it really doesn't matter. (But the static analysis tool doesn't complain about that.)

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

My question is, is there any reason that this could cause a problem? Should we ignore the errors generated by the tool, or should we placate the tool at the possible cost of a less clear and consistent API? (It returns other const char* constants that the tool doesn't have a problem with.)

推荐答案

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

It's usually better for your code to describe as accurately as possible what's going on. You're getting this warning because the const in const int foo(); is basically meaningless. The API only seems clearer if you don't know what the const keyword means. Don't overload meaning like that; static is bad enough as it is, and there's no reason to add the potential for more confusion.

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

const char * means something different than const int does, which is why your tool doesn't complain about it. The former is a pointer to a constant string, meaning any code calling the function returning that type shouldn't try to modify the contents of the string (it might be in ROM for example). In the latter case, the system has no way to enforce that you not make changes to the returned int, so the qualifier is meaningless. A closer parallel to the return types would be:

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

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

which will both cause your static analysis to give the warning - adding a const qualifier to a return value is a meaningless operation. It only makes sense when you have a a reference parameter (or return type), like your const char * example.

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

In fact, I just made a little test program, and GCC even explicitly warns about this problem:

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

因此,抱怨的不仅仅是您的静态分析程序.

So it's not just your static analysis program that's complaining.

这篇关于为了清楚起见,是否应该在返回类型上使用无用的类型限定符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆