我想知道你传递给gcc编译器的什么开关来关闭未使用的变量警告?我在Windows上获得了错误,我不想触摸增强代码:
C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]
Run Code Online (Sandbox Code Playgroud)
我尝试使用两者-Wunused-value,-Wno-unused-value但都没有压制上面的消息.
什么是正确的命令,这是我的编译行:
g++ -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
-c -o op.o op.cpp
Run Code Online (Sandbox Code Playgroud)
也许这-Wall超越了我的目标?
与此MSVC预处理器代码最接近的GCC是什么?
#pragma warning( push ) // Save the current warning state.
#pragma warning( disable : 4723 ) // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop ) // Restore warnings to previous state.
Run Code Online (Sandbox Code Playgroud)
我们在常用的标题中包含代码,我们不希望生成特定的警告.但是,我们希望包含这些标头的文件继续生成该警告(如果项目启用了该警告).
我要做一个丑陋的临时黑客,以便在我们等待修复外部资源时解决阻塞问题.除了用一个可怕的评论和一堆FIXME来标记它之外,我很乐意让编译器抛出明显的警告信息作为提示,所以我们不要忘记把它拿出来.例如,类似于:
[javac] com.foo.Hacky.java:192: warning: FIXME temporary hack to work around library bug, remove me when library is fixed!
Run Code Online (Sandbox Code Playgroud)
有没有办法可以使用我选择的消息引起有意的编译器警告?如果做不到这一点,最简单的事情是添加到代码中以抛出现有警告,可能在违规行的字符串中有一条消息,以便在警告消息中打印出来?
编辑:不推荐的标签似乎没有为我做任何事情:
/**
* @deprecated "Temporary hack to work around remote server quirks"
*/
@Deprecated
private void doSomeHackyStuff() { ... }
Run Code Online (Sandbox Code Playgroud)
在eclipse或sun javac 1.6(从ant脚本运行)中没有编译器或运行时错误,它肯定正在执行该函数.
偶尔编写一下根本不会发出警告的C++代码是很困难的.然而,启用警告是一个好主意.因此,通常需要禁用某些特定构造周围的警告,并在所有其他代码段中启用它们.
到目前为止,我已经看到了两种方法.
第一个是使用#pragma warning( push )和#pragma warning( pop ):
#pragma warning( push )
#pragma warning( disable: ThatWarning )
//code with ThatWarning here
#pragma warning( pop )
Run Code Online (Sandbox Code Playgroud)
第二是使用#pragma warning( default ):
#pragma warning( disable: ThatWarning )
//code with ThatWarning here
#pragma warning( default: ThatWarning )
Run Code Online (Sandbox Code Playgroud)
我在第二个变体中看到的问题是它丢弃了原始警告级别 - 警告可能在此之前已关闭或警告级别可能已被更改.使用default会丢弃这些改动.
第一种方法看起来很干净.它有什么问题吗?有没有更好的方法来实现同样的目标?
我的iOS项目中有一些文件有一些警告,我想忽略这些警告.我不想在整个项目中禁用警告(知道如何做),只是一些特定的文件.那么,有没有办法完全忽略特定文件中的所有警告?
我在Xcode 4.2上使用LLVM 3.0和Clang.
我在我的一个类中的方法中使用了枚举的完全限定名.但我收到编译器警告,上面写着"警告C4482:使用非标准扩展名:enum'Foo'用于限定名称".在C++中,我们是否需要使用没有限定名称的枚举?但IMO,看起来很难看.
有什么想法吗?
我知道这个问题提到了Boost的"静态警告",但我想再问一次,具体来说,我是如何实现一个static_warning操作方式类似static_assert但只在编译时发出警告而不是中止编译错误.
我想要类似于Alexandrescu关于在C++之前的11天中静态断言的提议,它在某种程度上设法打印了一些有用的上下文信息作为错误的一部分.
可以接受要求用户启用某些标准编译器警告以使此构造工作(可能是"无效指针转换"或"打破严格别名规则") - 任何警告应该是正常编译的一部分,无论如何都可以使用.
简而言之,我想static_warning(false, "Hello world");创建一个编译器警告,它应该以某种方式在警告消息中包含字符串"hello world".这是可能的,比如在GCC和MSVC,以及如何?
我很乐意为任何特别聪明的解决方案提供小额奖励.
作为一点解释:我在考虑这个问题时得到了一个想法:静态警告将是一种有用的方法来跟踪复杂模板特化的编译时过程,否则这些过程很难调试.静态警告可以用作编译器发出"我现在正在编译代码的这一部分"的简单信标.
更新.理想情况下,警告将在以下设置中触发:
template <typename T> struct Foo
{
static_warning(std::is_pointer<T>::value, "Attempting to use pointer type.");
// ...
};
int main() { Foo<int> a; Foo<int*> b; }
Run Code Online (Sandbox Code Playgroud) 有些人似乎建议你使用-Wall,但是当我做了一个小测试项目,它只是有一个main.cpp的一些包括,我得到5800个警告他们大多在标准头文件或窗口标题.
这是预期的行为吗?如何使编译警告免费?
这里有一些阅读乐趣:
1>c:\program files\microsoft visual studio 10.0\vc\include\stdint.h(105): warning C4668: '_INTPTR' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(109): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::attrib'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(114): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::name'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(118): warning C4820: '_wfinddata64_t' : '4' bytes padding added after data member '_wfinddata64_t::attrib'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(488): warning …Run Code Online (Sandbox Code Playgroud) 我有一堆编译时断言,例如:
CASSERT(isTrue) or CASSERT2(isTrue, prefix_)
Run Code Online (Sandbox Code Playgroud)
在使用GCC进行编译时,我会收到很多警告'prefix_LineNumber' defined but not used.有没有办法可以隐藏编译时断言的警告?我没有运气搜索GCC文档.我以为我可能会在同一个宏中全局自动使用var,但我想不出有任何办法.
有谁知道在GCC中隐藏警告的方法?
我已将three20项目导入到我的项目中,当我使用iOS 5升级到Xcode 4.2时,项目中出现了一堆警告.
我不关心它们,但它们会产生很多噪音,现在很容易错过我项目中的任何真实警告.有没有办法禁用这些特定库的警告?