c++ - 严格标准-符合Visual C++

标签 c++ visual-c++ wdk ansi-c

这个问题与以下两个问题不同:

我运行的是 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 根本不允许这样的假设。

我有一个枚举,其成员包括 OVERFLOWUNDERFLOW 。下面描述的问题可能会迫使我更改这些名称,但我宁愿保留它们,因为它们最适合我的目的,尽管有 Windows 头文件等外部影响。

GCC、Visual C++ 和 Mac OS X 的头文件(独立于 llvm-gcc)都定义 OVERFLOWUNDERFLOW以及其他非标准宏,默认位于 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/

相关文章:

c++ - 驱动程序中的 ETW 跟踪——过程后

c++ - std::string 和 std::wstring 的 wdk ddk 编译器问题

c++ - 从属名称的模板消歧器

c++ - 如何处理 boost::filesystem::path 的空格

C++ lambda 不推断函数重载

c# - 将包含数组字段的结构数组从 C++ 编码到 C#

visual-c++ - .h、.dll 和 .lib 混淆

c++ - 泛化一个函数

c++ - 为目录创建文件映射

visual-studio - AVX512 和 MSVC 预处理器符号