8

我和这个人有同样的问题。使用 clang 和 ccache 编译时,每次遇到 Q_OBJECT 时都会收到此警告:

warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign]

这仅在使用 ccache 时发生,单独使用 clang 编译相同的代码可以正常工作。

宏扩展似乎存在类似的问题,建议的解决方案是设置环境变量

CCACHE_CPP2=yes

不幸的是,这似乎不能解决我的问题,或者我做错了。

我努力了:

  • 从命令行构建

    • CCACHE_CPP2=yes ninja

    • export CCACHE_CPP2=yes ninja

  • 从 Qt Creator 构建,添加CCACHE_CPP2到“构建环境”

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

4

3 回答 3

3

尝试将 -Wno-self-assign 添加到 CPP flags 。它应该允许您禁用自分配错误:

CXXFLAGS= $(CXXFLAGS) -Wno-self-assign 

或者

CPPFLAGS=$(CPPFLAGS) -Wno-self-assign
于 2015-01-27T12:16:12.773 回答
3

请原谅我没有用叮当声来测试这个,但我觉得无论如何我都应该帮忙。扩展 Marek 的答案,有可能将 pragma 放在另一个宏扩展中。这是一个非常丑陋的解决方案,但这样您只需要定义一次宏,而不是在整个代码库中产生 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 进行测试),但是通过在宏中将“GCC”替换为“clang”(并使用 -Wself_assign)在 clang 中应该可以正常工作。适用于您的问题(伪代码):

#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 上,我必须运行预处理器两次才能使其工作。无法判断clang是否有必要这样做。

于 2015-02-04T19:26:15.063 回答
1

IMO 在全球范围内忽略此警告不是问题。它警告虚拟代码,而不是由拼写错误引起的潜在逻辑错误。这就是我投票支持@MichaelCMS 答案的原因。

但是有一种方法可以禁用警告只是代码的某些部分

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wself-assign"
Q_OBJECT
#pragma clang diagnostic pop

这应该可以解决问题(如果我没有弄乱标志名称的话),但我不喜欢它,太多样板宏。

于 2015-02-03T09:10:32.147 回答