通常在C下gcc,我将从以下一组警告标志开始(从多个来源痛苦地组装):
-Wall -Wextra -Wformat-nonliteral -Wcast-align -Wpointer-arith -Wbad-function-cast \
-Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Winline -Wundef \
-Wnested-externs -Wcast-qual -Wshadow -Wwrite-strings -Wno-unused-parameter \
-Wfloat-equal -pedantic -ansi
Run Code Online (Sandbox Code Playgroud)
我将使用这组警告构建(至少我的调试版本)并修复我可能做的所有事情(通常是一切),然后只删除标记,如果它们不相关或不可修复(几乎从不这样).有时,-Werror如果我必须在编译时离开,我也会添加.
我只是拿起C++(是的,我落后了15年),我想从右脚开始.
我的问题是:是否有人为C++预先编译了类似的完整警告标志集g++?(我知道其中很多都是一样的.)
我是C++编程的新手.编译时我从不使用任何选项.
这是我的日常命令:
g++ MyCode.cc -o MyCode
Run Code Online (Sandbox Code Playgroud)
对于安全实践,最好的选择是什么?
我似乎无法使用g ++来编译使用移动构造函数的c ++ 11代码.我一直收到这个错误:
collin@Serenity:~/Projects/arraylib$ g++ ./t2.cpp
./t2.cpp:10:27: error: expected ‘,’ or ‘...’ before ‘&&’ token
./t2.cpp:10:38: error: invalid constructor; you probably meant ‘Blarg (const Blarg&)’
Run Code Online (Sandbox Code Playgroud)
我正在编写的程序与此完全不同,但我将其修改为看起来应该绝对可行的部分,但仍会触发错误:
#include <iostream>
using namespace std;
class Blarg {
public:
Blarg () {};
Blarg (const Blarg& original) {}; /* Copy constructor */
Blarg (Blarg&& original) {}; /* Move constructor */
};
int main(int argc, char *argv[])
{
Blarg b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我做错了什么?相反,如何解决它?
这是我的gcc版本:
gcc (Ubuntu/Linaro 4.6.2-14ubuntu2) 4.6.2
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码段:
#include <iostream>
using namespace std;
int a[10][2];
int b[10][2];
int main(){
//intended
cout << a[0][0] - b[0][0] << endl;
//left out dimension by mistake
cout << a[0] - b[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)
显然(或者可能不是每个注释)第二种情况是C和C++中的有效指针算法,但在我使用它的代码库中通常是语义错误; 通常在嵌套的for循环中省略了维度.有没有-W标志或静态分析工具可以检测到这个?
以下是Bjarne Stroustrup的书"C++编程语言"的摘录:
第4.6节:
C++的基本类型的某些方面,例如int的大小,是实现定义的(§C.2).我指出了这些依赖关系,并经常建议避免它们或采取措施尽量减少它们的影响.你为什么要打扰?在各种系统上编程或使用各种编译器的人非常关心,因为如果他们不这样做,他们就不得不浪费时间寻找和修复模糊的错误.声称他们不关心可移植性的人通常会这样做,因为他们只使用一个系统,并且觉得他们能够承担"我的编译器实现的语言"的态度.这是一个狭隘而短视的观点.如果您的程序成功,可能会被移植,因此有人必须找到并修复与实现相关的功能相关的问题.此外,程序通常需要与同一系统的其他编译器一起编译,甚至你喜欢的编译器的未来版本可能会做一些与当前版本不同的东西.在编写程序时,了解并限制实现依赖性的影响要比在之后尝试解决混乱更容易.
限制依赖于实现的语言功能的影响相对容易.
我的问题是:如何限制依赖于实现的语言功能的影响?请提及依赖于实现的语言功能,然后展示如何限制其影响.
可能重复:
C/C++编译器的最佳编译器警告级别?
海湾合作委员会有数以千计的选择来增加警告; 我希望-Wall -Wextra -pedantic包括所有有用的,但刚才我遇到了-Woverloaded-virtual对我来说真的很好.
您使用或您推荐的其他G ++参数是什么?
当此编译器错误停止构建时,我正在将一些遗留代码移植到 VS 2015:
error C3867: 'OptDlg::GetFullModel': non-standard syntax; use '&' to create a pointer to member
Run Code Online (Sandbox Code Playgroud)
去对应的文件和行,看到这个:
Manager mgr = GetDocument()->GetManager();
OptDlg dlg;
...
mgr->SetFullModel(dlg.GetFullModel);
if ( dlg.GetFullModel )
mgr->SetSymm(...
Run Code Online (Sandbox Code Playgroud)
GetFullModel和SetFullModel是吸气/设定部对用于在两个不同的类的成员变量:
class Manager {
...
bool GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bFlag) { m_bFullModel = bFlag; }
....
};
class OptDlg {
...
void GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bValue) { m_bFullModel = bValue; if ( bValue ) m_bInside = 0;}
Run Code Online (Sandbox Code Playgroud)
是的,有些 …
问题.
请参阅下面的代码...我错过了该return field;语句,并没有发现它的一些调试运行.我永远不会想到这样的东西会在没有错误的情况下通过编译器!为什么呢?
描述
我有一个解析器对象,用于std::tr1::function在构造时接收转换算法.翻译从字符串转换成类型的对象TransportableMessage,它是由TMFields,可容纳不同类型的.所以无论如何我创建了一个用于创建字段的工厂函数,因为字段的类型基于一个字符串(来自XML),虽然现在只有少数几个,但未来可能会有更多.
该tstring对象是基于的类型转换,UNICODE并且基本上解析为std::wstring分钟.另外因为我使用VS2008 unique_ptr并不存在,所以我隐藏std::auto_ptr在后面ScopedPtr_t,以便更容易升级,因此更有可能发生.
namespace arc
{
namespace util
{
int internalTest()
{
std::cout << "Any error?" << std::endl;
}
ScopedPtr_T<TMField> TmFieldFactory( const tstring& name, const tstring& typeName, const tstring& value )
{
ScopedPtr_T<TMField> field;
int a = internalTest();
if( typeName == _T("int") || typeName == _T("long") )
{
field.reset( new TMNumericField( name, boost::lexical_cast<__int64>(value) ) );
}
else …Run Code Online (Sandbox Code Playgroud) 我们来看看这段代码:
#include <iostream>
int foo(int i) {return i; }
int foobar(int z) {return foo(z);}
int main() {
std::cout << foobar(3) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它用g ++ -std = c ++ 11编译好...并给出输出3.但是相同的输出由下式给出:
#include <iostream>
int foo(int i) {return i; }
int foobar(int z) { foo(z);}
int main() {
std::cout << foobar(3) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它编译没有问题,但显然foobar错过了关键字返回.这是gcc 4.8.3中的错误还是我不知道某些c ++ 11原则?(在Fedora 20上运行)
这是我用 vim 编辑器编写的一个简单程序:
#include <iostream>
using namespace std;
int main()
{
int a;
int b, c ;
a=(b+c+11)/3;
cout << "x=" << a;
cout << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们可以在windows中的Visual Studio中看到警告:
...error(s), 2 warning(s)
...\test1.cpp(7) : warning c4700: local variable 'b' used without having been initialized
...\test1.cpp(7) : warning c4700: local variable 'c' used without having been initialized
Run Code Online (Sandbox Code Playgroud)
但是,当我们使用 gnome-terminal 时,我们看不到警告:
SSS@SSS:~/.cpp$ g++ test1.cpp -o test1
SSS@SSS:~/.cpp$ chmod +x test1
SSS@SSS:~/.cpp$ ./test1
x=10925
SSS@SSS:~/.cpp$
Run Code Online (Sandbox Code Playgroud)
在终端中我们只能看到错误...
如何查看这些警告?
有什么命令可以查看警告吗?