这个问题与以下两个问题不同:
- Setting Visual C++ Studio/Express to strict ANSI mode
- Is there an equivalent to -pedantic for gcc when using Microsoft's Visual C++ compiler?
我运行的是 Windows 7 和 Visual Studio Express 2012,但我希望两者都不会影响此问题的答案。
tl;dr 我如何最恰本地抵消/防止/容忍以下 math.h 摘录的影响,同时仍允许使用 Visual C++ 进行编译?
#if !__STDC__
/* Non-ANSI names for compatibility */
#define DOMAIN _DOMAIN
#define SING _SING
#define OVERFLOW _OVERFLOW
#define UNDERFLOW _UNDERFLOW
#define TLOSS _TLOSS
#define PLOSS _PLOSS
#define matherr _matherr
背景:我正在编写一个基于文本的 C++ 项目,其总体目标远远超出了这个问题的范围。我使用 GNU Make(为了熟悉和可移植性)使用 Cygwin g++ 和 cl.exe 来编译它,并假设一个严格符合标准的环境......到目前为止。我开始认为 Windows 根本不允许这样的假设。
我有一个枚举,其成员包括 OVERFLOW
和UNDERFLOW
。下面描述的问题可能会迫使我更改这些名称,但我宁愿保留它们,因为它们最适合我的目的,尽管有 Windows 头文件等外部影响。
GCC、Visual C++ 和 Mac OS X 的头文件(独立于 llvm-gcc)都定义 OVERFLOW
和UNDERFLOW
以及其他非标准宏,默认位于 math.h 中。
- GCC 有 a selection彻底阻止这些定义的记录方法。
- Mac OS X 有几种未记录的方法可以执行相同的操作,其中之一 (
_POSIX_C_SOURCE
) 与 GCC 的文档一致。 (我提到这一点是为了弥补 Apple 文档的缺乏;我有这些标识符的历史记录。) - MSDN documents/u 命令行选项作为防止定义 a few 的手段(通过
__STDC__
宏) non-standard macros在 Visual C++ 中。如本问题开头所示,__STDC__
宏还阻止OVERFLOW
的定义和UNDERFLOW
.
发现/u 开关会阻止我关心的定义后,我将其添加到我的 makefile 中。但后来我从 crtdefs.h 的第 44 行收到了一个新错误:
error C1189: Only Win32 target supported!
这是因为_WIN32
不再定义。经过一番搜索发现 crtdefs.h 与 Windows 驱动程序开发工具包相关。我不是在开发驱动程序;我可以不使用该 header 吗?或者我只需要重命名我的枚举成员以容忍非标准 Windows 行为?
最佳答案
而不是使用 /u
编译器开关,它具有 multiple effects ,只需使用 /D__STDC__=1
即可定义 __STDC__
宏,仅此而已。
关于c++ - 严格标准-符合Visual C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12469577/