这个问题是不一样的任一:严格的标准,符合的Visual C++
- 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)都在math.h中定义了OVERFLOW
和UNDERFLOW
以及其他非标准宏。
- GCC有a selection干净地防止这些定义的记录手段。
- Mac OS X有几个无证的方法可以做到这一点,其中一个(
_POSIX_C_SOURCE
)与GCC的文档一致。 (我提到这是为了补偿苹果缺乏文档的兴趣;我有这些标识符的历史记录) - MSDN documents/u命令行选项作为一种手段(通过
__STDC__
宏)阻止定义a fewnon-standard macros in Visual C++。如问题开头所示,__STDC__
宏也阻止定义OVERFLOW
和UNDERFLOW
。
一旦发现/ u开关会阻止我所关心的定义,我将它添加到我的生成文件中。但后来我得到了一个新的错误从线44的crtdefs.h:
error C1189: Only Win32 target supported!
这是因为_WIN32
不再定义。有点搜索表明,crtdefs.h与Windows驱动程序开发工具包有关。我没有开发一个驱动程序;我可以以某种方式不使用该标题?或者我只需要重命名我的枚举成员以容忍非标准的Windows行为?
我听到了吗 - C++/CLI?与在公共语言基础结构中一样,AKA .NET?放弃对标准合规性的追求。 CLI和微软的扩展一样多。 –
@Seva CLI =命令行界面 – Grault