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

rlcwz9us  于 2023-03-25  发布在  其他
关注(0)|答案(3)|浏览(127)

这个问题与这两个问题都不一样:

我正在运行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)都默认在math.h中定义了OVERFLOWUNDERFLOW以及其他非标准宏。

  • GCC有a selection的文档化方法来完全阻止这些定义。
  • Mac OS X有几个没有文档的方法来做同样的事情,其中一个(_POSIX_C_SOURCE)与GCC的文档相吻合。我有这些标识符的历史。)
  • MSDN documents/u命令行选项作为一种防止在Visual C++中定义a fewnon-standard macros的方法(通过__STDC__宏)。如本问题开头所示,__STDC__宏 * 还 * 防止定义OVERFLOWUNDERFLOW

在发现/u开关会阻止我所关心的定义后,我将其添加到我的makefile中。但随后我从crtdefs.h的第44行得到一个新错误:

error C1189: Only Win32 target supported!

这是因为_WIN32不再被定义。搜索表明crtdefs. h与Windows驱动程序开发工具包有关。我能以某种方式不使用那个头吗?或者我只需要重命名我的枚举成员来容忍非标准的Windows行为?

w46czmvw

w46czmvw1#

不使用/u编译器开关,它有multiple effects,只使用/D__STDC__=1,它会导致__STDC__宏被定义,而不是其他任何东西。

eqoofvh9

eqoofvh92#

我想到了两种可能性。
第一个是确保在包含math.h时反转特定效果,如下所示:

#include <math.h>
#undef OVERFLOW
#undef UNDERFLOW

现在,这也可能会在某些地方导致代码期望这些东西被正确定义的问题。然而,即使在这种情况下,您也可以修改您的软件,为math.h使用不同的名称:

#include <math.h>
#undef OVERFLOW
#undef UNDERFLOW
#define MATH_H_OVERFLOW  _OVERFLOW
#define MATH_H_UNDERFLOW _UNDERFLOW

你只需要确保所有想使用math.h常量的源代码(已经编译好的代码,比如库),* 使用 * MATH_H_*常量,而不是枚举中的常量。
第二个是仔细考虑您在这个任务中投入的精力,与简单地将enum成员重命名为不冲突的东西所花费的精力相比。(而不是OVERFLOW)将是我的第一次尝试,因为两者中的信息量仍然完全相同,并且它消除了直接的冲突。
是的,我知道找到一种不涉及这一点的方法是很好的,但是你应该从事软件交付的工作,而不是花太多的时间在你的环境中处理一些小问题:-)

vktxenjb

vktxenjb3#

在C++11中,你可以使用scoped enum:

enum class Flows { Underflow, Overflow };

您现在可以参考Flows::Underflow和Flows::Overflow。
即使在C++98中,使用类来模拟它也是一个很好的实践:

class Flows
{
public:
    enum Value { Underflow, Overflow };
};

相关问题