这个问题与这两个问题都不一样:
- 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命令行选项作为一种防止在Visual C++中定义a fewnon-standard macros的方法(通过
__STDC__
宏)。如本问题开头所示,__STDC__
宏 * 还 * 防止定义OVERFLOW
和UNDERFLOW
。
在发现/u开关会阻止我所关心的定义后,我将其添加到我的makefile中。但随后我从crtdefs.h的第44行得到一个新错误:
error C1189: Only Win32 target supported!
这是因为_WIN32
不再被定义。搜索表明crtdefs. h与Windows驱动程序开发工具包有关。我能以某种方式不使用那个头吗?或者我只需要重命名我的枚举成员来容忍非标准的Windows行为?
3条答案
按热度按时间w46czmvw1#
不使用
/u
编译器开关,它有multiple effects,只使用/D__STDC__=1
,它会导致__STDC__
宏被定义,而不是其他任何东西。eqoofvh92#
我想到了两种可能性。
第一个是确保在包含
math.h
时反转特定效果,如下所示:现在,这也可能会在某些地方导致代码期望这些东西被正确定义的问题。然而,即使在这种情况下,您也可以修改您的软件,为
math.h
使用不同的名称:你只需要确保所有想使用
math.h
常量的源代码(已经编译好的代码,比如库),* 使用 *MATH_H_*
常量,而不是枚举中的常量。第二个是仔细考虑您在这个任务中投入的精力,与简单地将
enum
成员重命名为不冲突的东西所花费的精力相比。(而不是OVERFLOW
)将是我的第一次尝试,因为两者中的信息量仍然完全相同,并且它消除了直接的冲突。是的,我知道找到一种不涉及这一点的方法是很好的,但是你应该从事软件交付的工作,而不是花太多的时间在你的环境中处理一些小问题:-)
vktxenjb3#
在C++11中,你可以使用scoped enum:
您现在可以参考Flows::Underflow和Flows::Overflow。
即使在C++98中,使用类来模拟它也是一个很好的实践: