G++不同版本的C/C++软件移植指南

1.

strchr    error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]

针对GCC 4.4版本的C/C++软件移植指南 Sep 21, 2012

扩展阅读

如果你希望更加深入的了解GCC相关特性、体系及编程等,可参考以下的材料:

  1. 各类官方文档
  2. The Definitive Guide to GCC(William von Hagen著):全面介绍GCC相关内容,包括auto*工具链使用及语言特性的扩展等。
  3. Unix to Linux Porting (Alfredo mendoza等著):这是*nix软件移植开发最好的指南。

GCC 4.4版本的变化

C语言相关问题

预处理器条件都被执行

当用时候,现在其参数将被执行,即使前面的或条件执行结果为非0(onoe-zero)。这样做的目的是确保,它们(宏)是有效的常量表达式。示例代码,如下:

在新版本下,会产生以下错误诊断:

修正手段:要么使用不带参数,要么为提供常量表达式。

更加严格的“别名”要求

当优化代码时,GCC会对很多“类型双关type-punning”情况,发出告警。例如,

在新版本下,会产生以下错误诊断:

可以使用为变通方案或使用忽略此类问题。要修正问题,可以通过访问结构体,用一个union,用memcpy或(如果是C++)用操作替换。

C++语言相关问题

头文件依赖调整

针对头文件依赖,一些标准C++库include文件已被优化,仅include最小可能数量的附加文件。因此,使用了而没有include <cstdio> 的C++程序,或使用了而没有include <stdint.h> 的,将不再编译,而是 错。

具体细节,如下:

文件<cstdio>将不再作为<string>,<ios>,<iomanip>,<streambuf>,或<locale>的一部分被include。

文件<stdint.h>将不再作为<string>或<ios>的一部分被include.

限制null终止(null-terminated)序列的函数

一些C++库include已被修改,来替换C库函数的重载,以提高常量的正确性(const-correctness):接收const char,同时返回const char的函数。相关变更,如下表所示:

头文件 函数
<cstring> , , , ,
<cwchar> , , ,

应用示例,如下:

编译时,会 如下错误:

修正方式,如下:

初始化调整

GCC 4.4默认不再支持如下的代码:

编译这个代码会 以下错误:

用初始化成员即可解决相关问题。具体,如下:

2.

Compiler error: memset was not declared in this scope

You should include (or its C++ equivalent, ).

50 down vote

Whevever you get a problem like this just go to the man page for the function in question and it will tell you what header you are missing, e.g.

3. ‘int32_t’ does not name a type

4.  ‘bzero’ was not declared in this scope

     ‘strncpy’ was not declared in this scope

#include <string.h>

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113900 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2014年1月1日
下一篇 2014年1月2日

相关推荐