gpt4 book ai didi

c++ - 如何在宏中使用_Pragma 运算符?

转载 作者:行者123 更新时间:2023-11-30 03:24:28 24 4
gpt4 key购买 nike

我正在尝试使用 _Pragma 运算符来忽略宏内的警告:

#define RAII_BLOCK() \
_Pragma("GCC diagnostic push \"-Wshadow\"") \
_Pragma("GCC diagnostic ignored \"-Wshadow\"") \
auto a = RAII(); \
_Pragma("GCC diagnostic pop")

void foo() {
RAII_BLOCK();
{
RAII_BLOCK();
}
}

但我从 gcc 看到了非常奇怪的行为。如果 RAII_BLOCK 是一个没有参数的宏,它会按预期工作:https://godbolt.org/g/J6RxDV

但是如果我添加括号(在我的用例中我实际上需要传递一个真正的参数),gcc 开始提示:https://godbolt.org/g/tbNtje

请注意,clang 在这两种情况下都按预期工作。有谁知道如何解决这个问题(同时为其余代码保留阴影警告)?

最佳答案

查看https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53469https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=715271 ,似乎 GCC 在宏调用中处理 _Pragma 诊断指令在过去有一些问题,可能仍然存在。

我会建议另一种方法,即完全避免覆盖 RAII_BLOCK 定义中的诊断设置:

#include <iostream>
using namespace std;

struct RAII{
RAII() { cout << "acquired" << endl; }
~RAII() { cout << "released" << endl; }
};

#define CONCAT_(a, b) a ## b
#define CONCAT(a, b) CONCAT_(a, b)
#define RAII_BLOCK() auto CONCAT(a,__COUNTER__) = RAII();

void foo() {
RAII_BLOCK();
{
RAII_BLOCK();
}
}

这样,您所有的范围保护变量名称将始终是唯一的,从而消除了保护自己免受影子定义影响的必要性。

关于c++ - 如何在宏中使用_Pragma 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49698645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com