You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在不借助编译器辅助的情况下消除volatile变量的-Wunused-variable警告并避免冗余加载

如何在不借助编译器辅助的情况下消除volatile变量的-Wunused-variable警告并避免冗余加载

先跟你梳理下这个问题的背景:平时处理未使用变量的警告时,C里可以直接省略函数参数名,C和C通用的做法是把变量强转成void——比如static_cast<void>(x)或者(void)x。但如果变量是带volatile修饰的,这么搞就会触发冗余的加载操作,这显然不是我们想要的结果。

那要怎么在不依赖编译器特定指令(比如#pragma GCC diagnostic这类)的前提下解决这个问题?这里有个靠谱的替代方案:

  • 定义一个空的模板函数,专门用来“忽略”volatile变量:

    template<typename VolatileType>
    inline void ignore_volatile(const volatile VolatileType&) {}
    

    之后遇到未使用的volatile变量时,直接调用这个函数:ignore_volatile(your_volatile_var);

    为啥这个方法管用?因为函数参数是volatile类型的引用,编译器不会生成对变量的读取操作(毕竟函数体是空的,没有任何实际使用参数的逻辑),同时又能让编译器认为这个变量已经被“用到了”,直接消除未使用变量的警告。而且这个模板是标准C++语法,完全不依赖任何编译器扩展,完美符合“不借助编译器辅助”的要求。

如果嫌模板麻烦,也可以直接写一个针对特定类型的inline空函数,但模板的好处是能适配任意类型的volatile变量,不用重复写代码。

这个方法不会对volatile变量产生任何实际的读写操作,完美避开了void强转带来的冗余加载问题。

内容来源于stack exchange

火山引擎 最新活动