C++常见和不常见的编译警告和错误

作者:, 发表于

1.禁止函数指针和对象指针(包括void)的转换

出现的一个场景是将函数指针用void

warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object [-Wpedantic]

这个警告只有在gcc编译器并且开启pedantic编译选项才会出来。vs不会有提示。为避免此警告,可以在代码前添加__extension__。为保证可移植性,最佳方式是:

#ifdef __GNUC__
__extension__
#endif
the_statement_that_includes_the_cast;

这个是理论上是符合C++标准。解释如下:

A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All pointers to structure types shall have the same representation and alignment requirements as each other. All pointers to union types shall have the same representation and alignment requirements as each other. Pointers to other types need not have the same representation or alignment requirements.

2._WIN32_WINNT未被定义

vs编译项目有时候会有下面这一条警告:

_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:
- add -D_WIN32_WINNT=0x0501 to the compiler command line; or
- add _WIN32_WINNT=0x0501 to your project's Preprocessor Definitions.
Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target).

这个警告的原因是程序中用到了windows的API,程序在编译时需确定API的版本。如果有确定的版本,就用确定的版本。有时候实际上没有用到特别的API,此时可以简单在头文件或stdafx.h中指定_WIN32_WINNT=0x0501,也可以在编译选项中添加-D_WIN32_WINNT=0x0501

3.C4996(_CRT_SECURE_NO_WARNINGS)错误

很多人推荐大学的非专业的C++学习者直接用vc6而不是vs,其中一个很大的原因是vs的配置项太多,非专业学习者会比较迷惑。这个便是其中的一个。_CRT_SECURE_NO_WARNINGS是一个VS新手面临的最常见同时又难以理解的错误。这个错误主要原因是,VS以安全为由,禁止了某些不安全的C++函数。常见的错误信息如下:

 error C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

理论上而言,在代码文件的最前端(或者stdafx.h文件中,若有)直接添加宏可以抑制该警告提示:

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

或者添加下面这一行:

#pragma  warning(disable:4996)

但这种方法并不一定总是能行,原因不明。所以可以采取下面两种方法:

一、右击工程 - 属性 - 配置属性 - C/C++ - 命令行,命令行增加/D _CRT_SECURE_NO_WARNINGS

二、在Project properties->Configuration Properties->C/C++->Preprocessor->Preprocessor里添加_CRT_SECURE_NO_WARNING

要注意,VS在debugrelease两个编译模式下分别使用两套配置,这两套配置下都需要修改。注意第二种方法里,两种编译模式的预定义量(Preprocessor)的默认值不一样,不能简单复制粘贴给弄成一样的。否则编译时会出现非预期的结果。

Q.E.D.


上一篇:安装和配置boost2016年7月29日
安装 boost是除std外最常用的C++库,覆盖很多常用操作。目前最新的版本是1.59.0。 wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz tar -z


  • 支持使用微薄、微信和QQ的账户登陆进行评论。由各自网站直接认证,不会泄露你的密码。
  • 登陆后可选择分享评论到所绑定的社交网络,如微薄、人人和QQ空间。
  • 评论提交后无法修改。如需修改,请删除原评论再重新提交。
  • 评论支持LaTeX代码,行内公式请用\(a+b=c\),行间公式请用\[a+b=c\]。公式只支持英文字符。