c语言 - 了解"'const' at top level, which may reduce code readability without improving const correctn



请特别考虑下面的代码,注意get_length返回const size_t

#include <stdio.h>
const size_t get_length(void)
{
return 123;
}
void foo(void)
{
size_t length = get_length();
length++;

printf("Length #1 is %zun", length);
}
void bar(void)
{
// Still 123 because length was copied from get_length
// (copy ellision notwithstanding, which is not the point here)
size_t length = get_length();

printf("Length #2 is %zun", length);
}
int main(void) {
foo();
bar();
}

输出:

Length #1 is 124
Length #2 is 123

我收到以下来自叮当整洁的警告:

Clang-Tidy: Return type 'const size_t' (aka 'const unsigned long')
is 'const'-qualified at the top level,
which may reduce code readability without improving const correctness

此消息包含关于返回类型的两部分:

  • 构造正确性未得到改善
  • 代码可读性降低

我理解第一部分,就像在foo和bar中一样,由于调用方不需要将其局部变量指定为const,因此最终const的正确性没有得到改善,也就是说,没有什么可以阻止调用者忽略被调用者返回const对象这一事实。

但我不确定";代码可读性降低"-这仅仅是因为它可能会给一些人带来错误的期望,即回报类型永远不会被修改吗?或者,它还有其他东西,只有在更复杂的返回类型中才开始有意义?

我之所以这么问,是因为我不认为这里的可读性会降低,我只是不确定警告背后的意图是什么。谢谢

您可以在那里使用const,但Clang Tidy将其标记为无效也是正确的。

相关问答;如下面所述,为了清楚起见,是否应该使用返回类型上无用的类型限定符?,将"const"与标量类型一起使用的好处?涵盖CCD_ 4在这种情况下无效的部分。

问题的另一部分是为什么">代码可读性降低";,这是因为一个多余的const限定符可能会分散对核心事实的注意力,即const‘ness不会在值分配中携带。例如,它可能会诱使客户端代码错误地认为返回值也必须用作const,例如const size_t val = get_length();,这不是真的,正如发布的代码所示。

类似的警告也适用于争论。假设const size_t get_length();的返回值总是传递给另一个函数baz(get_length());baz的自变量不需要(也可以说不应该(声明为const size_t,而只是简单的size_t,即void baz(size_t);

1。构造正确性未得到改善

返回的值只能用作右值。不可能更改右值,因此已经给出了常量的正确性。

2.代码可读性降低

你在引导读者做出错误的假设。

示例

/* the rest of your example... */
void baz(void)
{
size_t length = get_length();
length += 42;

printf("Length #2 is %zun", length);
}

没有什么可以阻止length的变化。它被一个常量初始化,对吧,就像size_t length = 123;

/* the rest of your example... */
void fu(void)
{
const size_t length = get_length();
length += 42; /* will give a compile-time error */

printf("Length #2 is %zun", length);
}

最新更新