使用ccache / clang编译Qt代码时,请避免多余的警告

时间:2015-01-27 09:20:05

标签: c++ qt clang ccache

我遇到与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添加到"构建环境"

我还能做些什么来解决这个宏扩展问题吗?我特别不希望全局禁用警告(因为那很糟糕)或本地(因为这意味着将所有宏包装在特定于编译器的样板文件中)。

3 个答案:

答案 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

这应该可以解决问题(如果我没有弄乱旗帜名称),但我不喜欢它,对于许多锅炉板宏。