我遇到与this guy相同的问题。 使用clang和ccache进行编译每次遇到Q_OBJECT时都会收到此警告:
warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign]
这只在使用ccache时才会发生,只用clang编译相同的代码就可以了。
似乎有similar issue with macro expansions建议的解决方案是设置环境变量
CCACHE_CPP2=yes
不幸的是,这似乎无法解决我的问题,或者说我做错了。
我试过了:
使用
命令行构建 CCACHE_CPP2=yes ninja
export CCACHE_CPP2=yes
ninja
从Qt Creator构建,将CCACHE_CPP2
添加到"构建环境"
我还能做些什么来解决这个宏扩展问题吗?我特别不希望全局禁用警告(因为那很糟糕)或本地(因为这意味着将所有宏包装在特定于编译器的样板文件中)。
答案 0 :(得分:3)
尝试将-Wno-self-assign添加到CPP标记。它应该允许您禁用自我分配错误:
CXXFLAGS= $(CXXFLAGS) -Wno-self-assign
或
CPPFLAGS=$(CPPFLAGS) -Wno-self-assign
答案 1 :(得分:3)
请原谅我没有用铿锵来测试一下,但我觉得无论如何我都应该帮忙。扩展Marek的答案,有可能将pragma放在另一个宏扩展中。这是一个非常难看的解决方案,但是这样你只需要定义宏一次,而不是在你的代码库中产生编译指示。
#define WARN int&x = x;
#define NO_WARN _Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wuninitialized\"") \
WARN \
_Pragma("GCC diagnostic pop")
int main(){
NO_WARN
}
正如你所看到的,我用gcc测试了它(我现在没有用clang测试的方法),但是在clang中用“GCC”代替宏中的“clang”(并使用-Wself_assign)应该可以正常工作)。适用于您的问题(伪代码):
#ifdef clang
#define MY_Q_OBJECT _Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wself-assign\"") \
Q_OBJECT \
_Pragma("clang diagnostic pop")
#else
#define MY_Q_OBJECT Q_OBJECT
#endif
class A{
MY_Q_OBJECT // Unfortunately you still need to replace Q_OBJECT on your classes
}
另一个丑陋的缺点是,至少在gcc上,我必须运行两次预处理器才能工作。无法判断铿锵是否有必要。
答案 2 :(得分:1)
IMO在全球范围内忽略此警告不是问题。它警告虚拟代码,而不是由打字错误引起的潜在逻辑错误。这就是我对@MichaelCMS回答的原因。
但有一种方法disable warning only is some section of code:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wself-assign"
Q_OBJECT
#pragma clang diagnostic pop
这应该可以解决问题(如果我没有弄乱旗帜名称),但我不喜欢它,对于许多锅炉板宏。