所以,我已经得到了这段代码:
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上运行)。
答案 0 :(得分:4)
GCC有一个标志来建议像const
这样的有益属性-Wsuggest-attribute = [pure | const | noreturn | format]警告添加属性可能有益的情况。目前的属性 支持列表如下。
-Wsuggest属性=纯
-Wsuggest属性=常数
-Wsuggest属性=不返回的
警告可能是属性pure,const或noreturn的候选函数。仅限编译器 警告其他编译单元中可见的功能或(在这种情况下) 如果它不能证明函数返回,则为pure和const) 一般。如果函数不包含函数,则函数会正常返回 无限循环或通过投掷,调用中止或异常返回 诱捕。这个分析需要选项-fipa-pure-const,即 默认情况下启用-O和更高版本。更高的优化级别 提高分析的准确性。
答案 1 :(得分:-2)
const传播。事实上,它经常成为一个问题,被称为“常中毒”。问题是像strchr()这样的函数,可以用const指针或变量指针调用。但是如果它返回一个const *,则不能通过指针修改字符串,这通常是你想要做的。
但是如果你只是在你初始化它之后立即在你的常量数据const上创建它,那么每次你尝试传递给非const限定语境时,编译器都会向你抛出错误。