-Wall
。它在GCC 4.7或以上版本(或Clang)时启用,因为我们可以使用GCC Diagnostic
来管理升级警告的输出。我们想要从源代码中管理它们,而不是通过命令行参数。(我们不想污染命令行,或者要求库用户重新发现所需内容)。在GCC 4.8和5.1下,我们正在捕获被禁用的警告,这些警告在GCC诊断块中被禁用,如
-Wunused-variable
、-Wunused-value
、-Wunused-function
和-Wunknown-pragmas
。这两个GCC都接受-fopenmp
,并且都会在响应它时定义_OPENMP
,所以我非常确定我们永远不会在#prgam omp ...
的响应中看到一个-Wunknown-pragmas
(它已经被禁用,但它不是未知的)。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
^
...
在这种情况下,文件
nbtheroy.cpp
中设置了以下保护措施来帮助管理该警告(仅显示相关部分,但您可以从GitHub链接中查看全部内容):// 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
(但对于被包含的头文件我们会这样做)。我们也曾尝试过这样做,但没有帮助。下面是来自
misc.h
的 GCC_DIAGNOSTIC_AWARE
:// 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__))
我知道守卫在工作,因为在块中添加
#error
会导致错误。 此外,注释掉守卫并调用#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
编辑:我们提交了一个补丁,除了Clang以外,禁用了-Wall
。如果您想要复制旧的行为,则:
git clone https://github.com/weidai11/cryptopp.git cryptopp-warn
cd cryptopp-warn
export CXXFLAGS="-g2 -O3 -DNDEBUG -Wall"
make
#if/#endif
(只留下#pragma GCC ...
)以查看是否存在GCC_DIAGNOSTIC_AWARE
的问题。 - paxdiablo#pragma GCC diagnostic ignored "-Wunknown-pragmas"
。 - jww-Wunknown-pragmas
,-Wunused-variable
,-Wunused-value
),而向命令行添加其他选项是不可接受的。根本问题是GCC的一个错误,而这甚至没有在所谓的重复问题中提到。 - jww