【问题标题】:How to suppress the compiler warning on unused variable in C?如何抑制 C 中未使用变量的编译器警告?
【发布时间】:2016-11-02 02:09:13
【问题描述】:

对于嵌入式系统中的外围需求,我必须声明一个变量来读取寄存器,但以后不会使用该值。因此,我自然会收到关于我未使用的变量的编译器警告。 如何抑制警告?我有两种方法:

  1. 使用编译器指令,我犹豫了,因为它们依赖于编译器
  2. 从变量中添加一个虚拟读取,例如:

    volatile int var;
    
    var = peripheral_register;
    
    var = var;
    

你有更好的主意吗?

【问题讨论】:

  • 传统上,您为此目的使用(void)variable
  • @FUZxxl:这实际上是正确的方法。其他表达式仍然可以生成警告(不能保证某些垃圾编译器会抱怨这一点并且不会在其他表达式上)。
  • 3) 不要以这种方式访问​​外围设备,希望编译器生成所需的指令并产生负载,必须给编译器一个创建指令的理由。
  • 呸,我刚刚意识到即使是 GCC 也会对 volatile 发出这样的蹩脚警告。 “变量 x 已设置但未使用”。我认为这是一个编译器错误。

标签: c embedded compiler-warnings


【解决方案1】:

如果您只需要读取寄存器(例如清除一些状态标志),那么您根本不需要接收变量:

(void)peripheral_register ;

假设寄存器本身被声明为 volatile 就足够了,因此它必须被读取。

否则,您可以通过外部链接使您的虚拟 var 全局 - 这样编译器就无法确定它没有在其他地方读取;但这是一个更丑陋的解决方案。

【讨论】:

    【解决方案2】:

    定义一个宏为

    #define unused(x) ((void)x)
    

    如果 peripheral_register 是未使用的变量,则只需调用宏 未使用(peripheral_register)。这将删除警告。

    【讨论】:

    • void((x)) 是 C 语言中的一个错误,也许你的意思是 ((void)x)
    【解决方案3】:

    你的变量使用了。读取volatile 变量是一种副作用。

    如果您收到编译器警告,我强烈怀疑您的编译器不符合 C 标准。您应该反汇编为代码以确保读取实际发生。否则,您的编译器已损坏,无法修复。

    话虽如此,您可以将任何表达式转换为 (void) 以消除编译器警告,例如 (void)var;。但在这种情况下,您不需要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2016-10-02
      • 2012-12-06
      • 1970-01-01
      相关资源
      最近更新 更多