【问题标题】:What does this statement mean in C: "(void)ptr;" [duplicate]这个语句在 C 中是什么意思:“(void)ptr;” [复制]
【发布时间】:2017-09-20 22:16:38
【问题描述】:

可能从标题看不清楚。我在一个嵌入式 STM32 项目中遇到了以下代码。我不明白函数里面的行。

    static void txend1(UARTDriver *uartp) {
        (void)uartp; // what does this do? Is it a statement?
    }

我尝试在网上其他地方搜索,但大多数结果都是将指针转换为 void 指针,我认为不是。感谢您的帮助!

【问题讨论】:

  • 它的意思是“不要告诉我我写的代码不好,我打算不使用参数”。 C 编译器对此有点厌烦,往往会产生警告。通常是适当的,但不是在这里。他不想在传送结束的时候做任何特别的事情,并不稀奇。函数指针不是他的选择。
  • @HansPassant 这很可能是由于来自外部方的强制 API 和/或为了统一起见 - 例如,可以有一个使用指针的替代实现。
  • 是的,这就是“函数指针不是他的选择”的意思。

标签: c embedded stm32


【解决方案1】:

这只是这个未使用的uart 参数上的portable way to suppress the warning

它没有任何效果,但编译器认为它已被使用,并且不会发出任何警告。

当函数的原型被强加/不能改变(回调函数)但你的实现不需要这个参数时非常有用。

(注意gcc 支持__attribute__((unused)) 结构,更容易理解,但并不兼容所有编译器)

【讨论】:

  • 嗯...呃..为什么不告诉编译器不要警告而不是编码废话?
  • 因为您希望对您不知道的地方发出警告,这就是您在您所在的地方防止它的方法。一些编译器有编译指示或指令,但 gcc 和其他编译器会让你只做 x=x;或者在这种情况下可能是 x;
  • @savram 您可能希望收到有关其他未使用变量的警告。
  • 对我来说仍然很脏。它是依赖于特定编译器行为的代码。如果编译器足够聪明,可以真正判断出该行是无意义的并且该变量仍未被使用怎么办?便携,对吧……直到它不再存在。
  • @Jean-François Fabre 我确信您没有回答 10k 次回答的问题。有些答案已有多年历史
猜你喜欢
  • 2012-03-24
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2014-02-20
相关资源
最近更新 更多