- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们最近为一个项目启用了 -Wall
。它在 GCC 为 4.7 或更高版本(或 Clang)时启用,因为我们可以使用 GCC diagnostic
管理提升警告的输出。我们希望通过源代码管理它们,而不是通过命令行参数。 (我们不想污染命令行,或者要求图书馆用户重新发现需要什么)。
在 GCC 4.8 和 5.1 下,我们正在捕获在 -Wunused-variable
、-Wunused-value
、-的 GCC 诊断 block 中禁用的警告- Wunused-function
和 -Wunknown-pragmas
。两个 GCC 都接受 -fopenmp
,并且都定义了 _OPENMP
来响应它,所以我很确定我们永远不会看到 -Wunknown-pragmas
code> 以响应 #prgam omp ...
(它被禁用,但它不是未知)。
g++ -DNDEBUG -g2 -O3 -Wall -march=native -pipe -c nbtheory.cpp
nbtheory.cpp:655:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]
#pragma omp parallel
^
nbtheory.cpp:656:0: warning: ignoring #pragma omp sections [-Wunknown-pragmas]
#pragma omp sections
^
...
在这种特殊情况下,file nbtheroy.cpp
有以下防护措施来帮助管理该警告(仅显示相关部分,但您可以看到 the GitHub link 中的所有内容):
// Defines GCC_DIAGNOSTIC_AWARE if GCC 4.7 or above.
#include <misc.h>
...
#if GCC_DIAGNOSTIC_AWARE
# pragma GCC diagnostic ignored "-Wunknown-pragmas"
#endif
...
Integer ModularRoot(const Integer &a, const Integer &dp, const Integer &dq,
const Integer &p, const Integer &q, const Integer &u)
{
Integer p2, q2;
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
p2 = ModularExponentiation((a % p), dp, p);
#pragma omp section
q2 = ModularExponentiation((a % q), dq, q);
}
return CRT(p2, p, q2, q, u);
}
...
因为文件是*.cpp
(它实际上是翻译单元),我们不执行#pragma GCC diagnostic push
开头,#pragma GCC diagnostic pop
结尾。 (但是,我们对包含的头文件执行此操作)。 (我们也尝试过这样做,但没有帮助)。
这里是 GCC_DIAGNOSTIC_AWARE
(来自 misc.h
):
// Used to suppress some warnings in some header and implementation files.
// Some platforms, like CentOS and OpenBSD, use old compilers that don't understand -Wno-unknown-pragma.
#define GCC_DIAGNOSTIC_AWARE ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__clang__))
我知道守卫正在工作,因为在 block 中添加 #error
会导致错误。此外,注释掉 guard 并调用 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
也无济于事。最后,它在 Clang 下运行良好。
我也遇到过其他警告,例如 -Wunused-variable
、-Wunused-value
和 -Wunused-function
。我真的不想像建议的那样用潜在的重复来污染命令行。
当使用 -Wall
时,如何让 GCC pragma diagnostic
机制按预期工作以消除 GCC 下的警告?
相关,如果你想复制它(它基于 GNUmakefile,不需要配置或自动工具):
git clone https://github.com/weidai11/cryptopp.git cryptopp-warn
cd cryptopp-warn
make
EDIT:我们 checkin 了一个补丁,该补丁禁用了除 Clang 之外的 -Wall
。如果你想重现旧的行为,那么:
git clone https://github.com/weidai11/cryptopp.git cryptopp-warn
cd cryptopp-warn
export CXXFLAGS="-g2 -O3 -DNDEBUG -Wall"
make
最佳答案
这似乎是 gcc
中的一个错误。至少。以下代码:
#pragma GCC diagnostic ignored "-Wunknown-pragmas"
#pragma GCC diagnostic ignored "-Wuninitialized"
int fn(void) {
#pragma xyzzy
int x;
return x;
}
int main (void) {
return fn();
}
忽略未初始化的 x
没有问题值,但仍然提示编译指示(没有 uninitialized
编译指示,它会如您所料生成 x
的警告)。
如果您将命令行选项更改为 -Wall -Wno-unknown-pragmas
,然后它忽略它就好了。这对于您的特定情况没问题,因为您希望它应用于整个翻译单元,但它不允许您从 #pragma
获得的细粒度控制。方法(如果有效)。
我去提出关于 GCC 的错误报告,但发现它已经存在 (#53431)。
虽然该特定错误与 -Wundef
有关,其中一个评论中的片段表明它可能适用于影响预处理器的所有变体(为了强调而稍作修改):
The C++ parser lexes (and preprocesses) before handling the pragmas, whereas the C parser processes the pragmas as it sees them.
We must somehow parse these pragmas also in
cp/parser.c:631
. Maybe one can do something similar to what we do forcp_parser_initial_pragma
, but within the loop and only handling pragma diagnostic. Surely, it will need some trial and error to get it right. If any of you wants to give it a try and need some help, just ask here or in the mailing list.
这就解释了为什么我们在 -Wuninitialized
上看不到同样的问题。 , 因为它是在编译过程的后期阶段检测到的,在预处理结束时激活 pragma 之后。
因此,如果您希望看到它以更及时的方式得到修复(它是在三年前提出的),我建议(就像我一样)麻烦 GCC bugzilla 网站以尝试获得一些曝光。
关于c++ - GCC 不遵守 'pragma GCC diagnostic' 以消除警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31509434/
你好,我正在尝试在 opensuse 中创建一个 Shell 脚本来创建 MySqlUsers,但是当我尝试运行它时,我得到了这个错误: Warning: Could not start progra
我阅读了有关此错误的所有信息,但未能找到任何解决方案。 我有一个看起来像这样的简单页面: $xmlfile = "/var/www/marees.xml"; //Fichier dans lequel
运行 Websphere App 服务器 V8.5 Liberty Profile。我找不到任何可以解决这些警告的帮助。我在 eclipse 。 ************** He
我尝试在 GC AppEngine 上部署应用程序。部署过程中没有错误,但应用程序无法运行(仅显示加载页面)。日志中唯一一个奇怪的原始 OpenBLAS WARNING - could not det
我刚开始学习 RestKit。我正在尝试使用它来使用 Foursquare api 获取附近的 field 。但每次我尝试“objectLoader:(RKObjectLoader *)objectL
我对 Vuejs 比较陌生,每次按键时都会收到以下警告: [Vue warn]: $attrs is readonly. found in ---> at src\component
Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external
我在尝试修改某些表时不断收到此错误。这是我的代码: /** = 1){ //$this->mysqli->autocommit(FALSE); //insert th
当我尝试使用 PHP 的 ftp_put 函数上传文件时,早些时候出现错误: 警告:ftp_put() [function.ftp-put]:无数据连接 现在,我尝试开启被动模式: ftp_pasv(
我一直在努力让这段代码适用于现阶段的年龄。它旨在计算一个范围内的素数,我已经编写了一种方法来打印它们。不幸的是,代码将无法编译,引用警告: “警告:[未检查] 未检查调用 add(E) 作为原始类型
尝试使用带有架构组件和Kotlin的Android Studio 3 Canary 5构建示例会给出此警告。 谁能告诉我原因? 谢谢,Ove 编辑#1: 这是Dan Lew前段时间制作的样本 http
我正在编写一个 Shiny 的应用程序,它运行得非常好,突然我收到两条警告消息。我已经回到以前运行良好的副本,它们现在显示相同的错误消息,所以我真的很困惑。我的代码仍然运行并在我 Shiny 的仪表板
03-25 05:52:15.329 8029-8042/com.mgh.radio W/MediaPlayerNative: info/warning (703, 0) 03-25 05:52:15
我在构建时在我的 gradle 控制台中收到一条警告消息: 警告:[options] 引导类路径未与 -source 1.7 一起设置 1 条警告 我怎样才能解决这个问题? 任何帮助表示赞赏! 最佳答
我有下一个代码: 测试.c #include "a1.h" int main() { int a = 8; foo(a); return a; } a1.h void foo
我的程序中有一个 WORD 变量。 WORD hour; 但是当我比较它的时候 if(hour>=0 && hour=0 && hour=0 的比较,它始终适用于 hour 是 WORD 类型,它是一
安全研究人员警告称,一个最新的严重的Java错误,其本质与目前在全球范围内利用的臭名昭著的 Log4Shell 漏洞相同 。 CVE-2021-42392 尚未在国家漏洞数据库 (NVD) 中
安装SqlServer2005时“版本变更检查 (警告)"问题排查 今天同事在安装SqlServer2005时遇到“版本变更检查 (警告) ”问题导致安装失败,警告提示如下: - 版本
我的 UWP 项目中出现以下警告。我已经标记了解决方案的示例,但我更感兴趣的是为什么在同一平台上创建另一个空项目时不会出现此警告? APPX4001: Build property AppxBundl
我试图修复我的登录脚本,在我的本地主机上它可以工作,但上传到我的在线测试服务器时,注销被破坏,我得到这个错误: Warning: session_destroy() [function.session
我是一名优秀的程序员,十分优秀!