C++代码升级C++11编译报错常见问题及解决

近日代码编译升级C++11,编译中遇到的一些warning问题解决,且在C++11之前的编译版本代码没有任何报错(ERROR)和警告(WARNING)的情况下进行重编遇到的问题。

  • 旧版编译版本:g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
  • 新版编译版本:g++ (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4

1、warning: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wliteral-suffix]

问题出现原因: c++ 11要求文字和标识符之间有空格(直译)

解决方式:变量和字符串之间需要使用空格间隔,

如:

"UpdateDeploy platetime[%"PRI64"]"

修改为:

"UpdateDeploy starttime[%" PRI64 "]"

2、warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

问题出现原因: 有符号int和无符号int 数据进行比较导致

解决方式:把int显示转化为unsigned int进行比较(是具体情况进行转变)

3、warning: deleting object of polymorphic class type ‘ClassName’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]

问题出现原因:原来如果基类里有虚函数,定义了基类指针指向派生类,就会需要定义基类虚析构,这样,基类指针析构的时候,就会先析构派生类,再析构基类。如果不定义虚析构,就会基类指针直接析构基类。这样派生类对象销毁不完整。所以编译器会警告。

解决方式:需要把基类中的析构函数声明为虚析构,这样销毁派生类对象时就能把子类析构函数也执行,若不声明为虚析构则子类未进行析构。

 

以上为目前遇到的问题,后续应该都在C++11上进行编译,不存在该现象。

你可能感兴趣的:(C++,c++,c++11)