如何在C语言中消除未使用变量的编译器警告?

6

针对嵌入式系统中外设需求,我需要声明一个变量来读取寄存器,但并不会在后续使用该值。因此,编译器自然会发出有关未使用变量的警告。 如何消除这个警告?我有两种方法:

  1. using compiler directives, I hesitate because they are compiler-dependent
  2. adding a dummy read from variable, like:

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

你有更好的想法吗?


5
传统上,您可以使用 (void)variable 来达到这个目的。 - fuz
1
可能是 C语言中忽略返回值 的重复问题。 - stdcall
@dwelch编译器必须为此代码生成读取指令,否则它将违反C标准的核心:程序执行的定义。 - Lundin
@Lundin 从一个 volatile 变量读取的内容包含在实现定义内,因此从技术上讲编译器是没有问题的。 - fuz
@FUZxxl https://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf - Lundin
显示剩余10条评论
3个回答

8

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

(void)peripheral_register ;

假设寄存器本身已声明为易失性变量,因此必须读取它,则这样做就足够了。否则,您可以将虚拟的 var 设为具有外部链接的全局变量-这样编译器无法确定它是否在其他地方被读取;但这是一个更加丑陋的解决方案。

3

将宏定义为

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

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

1
void((x)) is an error in C, maybe you meant ((void)x) - M.M

2

您的变量已被使用。读取volatile变量是一种副作用。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接