如何在C中找到应该是常量的变量?

时间:2017-05-22 17:49:52

标签: c

所以,我已经得到了这段代码:

uint8_t* pbytes = pkt->iov[0].iov_base;

创建指向结构中以太网数据包开头的指针。

我要求我的朋友查看代码,他说:"你没有修改它,如果你这样做会很困惑,所以把它变成const"。 / p>

这似乎是一个好主意,所以:

const uint8_t* pbytes = pkt->iov[0].iov_base;

甚至:

const uint8_t * const pbytes = pkt->iov[0].iov_base;

现在我在想,我敢打赌其他地方还有很多我可以做到的地方,我敢打赌,编译器会比我更好地找到它们。

我是怎么问这个问题的? (gcc首选,但使用不同的编译器或linting工具没问题,只要它们可以在unix上运行)。

2 个答案:

答案 0 :(得分:4)

GCC有一个标志来建议像const

这样的有益属性
  

-Wsuggest-attribute = [pure | const | noreturn | format]警告添加属性可能有益的情况。目前的属性   支持列表如下。

     

-Wsuggest属性=纯
  -Wsuggest属性=常数
  -Wsuggest属性=不返回的
  警告可能是属性pure,const或noreturn的候选函数。仅限编译器   警告其他编译单元中可见的功能或(在这种情况下)   如果它不能证明函数返回,则为pure和const)   一般。如果函数不包含函数,则函数会正常返回   无限循环或通过投掷,调用中止或异常返回   诱捕。这个分析需要选项-fipa-pure-const,即   默认情况下启用-O和更高版本。更高的优化级别   提高分析的准确性。

Src:http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

答案 1 :(得分:-2)

const传播。事实上,它经常成为一个问题,被称为“常中毒”。问题是像strchr()这样的函数,可以用const指针或变量指针调用。但是如果它返回一个const *,则不能通过指针修改字符串,这通常是你想要做的。

但是如果你只是在你初始化它之后立即在你的常量数据const上创建它,那么每次你尝试传递给非const限定语境时,编译器都会向你抛出错误。