Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 严格遵守Visual C+标准+;_C++_Visual C++_Ansi_Wdk - Fatal编程技术网

C++ 严格遵守Visual C+标准+;

C++ 严格遵守Visual C+标准+;,c++,visual-c++,ansi,wdk,C++,Visual C++,Ansi,Wdk,这个问题与以下两个问题不一样: 我正在运行Windows 7和Visual Studio Express 2012,但我希望两者都不会影响这个问题的答案 tl;DR我如何最恰当地抵消/防止/容忍数学的h节拍的影响,而仍然允许用Visual C++ ++ < /P>编译? #if !__STDC__ /* Non-ANSI names for compatibility */ #define DOMAIN _DOMAIN #define SING _SI

这个问题与以下两个问题不一样:

我正在运行Windows 7和Visual Studio Express 2012,但我希望两者都不会影响这个问题的答案

tl;DR我如何最恰当地抵消/防止/容忍数学的h节拍的影响,而仍然允许用Visual C++ ++ < /P>编译?
#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根本不允许这样的假设

我有一个枚举,其成员包括
溢出
下溢
。下面描述的问题可能会迫使我更改这些名称,但我更愿意保留它们,因为它们最适合我的用途,尽管存在诸如Windows头文件之类的外部影响

GCC、Visual C++和Mac OS X的头文件(独立于LLVM GCC)都定义了<代码>溢出< /代码>和<代码>下溢,在其他非标准宏中,默认为.h /p>

  • GCC提供了一套文件化的方法来明确防止这些定义
  • Mac OS X有两种未经记录的方法来做同样的事情,其中一种(
    \u POSIX\u C_SOURCE
    )与GCC的文档一致。(我提到这一点是为了弥补苹果缺乏文档的缺陷;我有这些标识符的历史。)
  • MSDN /u命令行选项作为一种手段(通过<代码>“ysSTDCc<宏”)来防止VisualC++中的定义。如本问题开头所示,
    \uuu STDC\uuuu
    宏还防止定义
    溢出
    下溢
当发现/u开关会阻止我所关心的定义时,我将它添加到我的makefile中。但是我从crtdefs.h的第44行得到了一个新的错误:

error C1189: Only Win32 target supported!

这是因为不再定义WIN32。稍微搜索一下就表明crtdefs.h与Windows驱动程序开发工具包有关。我不是在培养司机;我可以不使用那个标题吗?还是只需要重命名枚举成员就可以容忍非标准的Windows行为?

我想到了两种可能性

第一个是确保在包含
math.h
时反转特定效果,例如:

#include <math.h>
#undef OVERFLOW
#undef UNDERFLOW
您只需确保所有想要使用
math.h
常量的源代码(已经编译过的代码,如库)都使用
math\uh*
常量,而不是枚举中的常量


第二是要非常仔细地考虑你在这个任务中付出的努力,与简单地将你的
enum
成员重命名为不冲突的成员相比。我第一次尝试使用
Overflow
进行枚举(而不是
Overflow
),因为两者中的信息量仍然完全相同,并且消除了直接冲突


是的,我知道找到一种不涉及这一点的方法是很好的,但您应该致力于交付软件,而不是花费过多的时间来处理环境中的小问题:-)在C++11中,您可以使用作用域枚举:

enum class Flows { Underflow, Overflow };
现在您指的是Flows::Underflow和Flows::Overflow

即使在C++98中,使用类来模拟也是一种很好的做法:

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

与其使用
/u
编译器开关(它有),只需使用
/D_uustdc\uuu=1
,这会导致定义
\uu STDC\uuuu
宏,而无需其他任何操作。

我听到正确的-C++/CLI?就像在公共语言基础设施中一样,也就是.NET?放弃对标准遵从性的追求。CLI是尽可能多的Microsoft扩展。@Seva CLI=命令行界面外观#1,我忘了提到我担心它不太干净。。。如果可能的话,我宁愿预防而不是抵制。但除非我有理由不这么做,否则我可能会这么做。(我从不使用math.h宏)和re:#2。。。是的,但我很固执,这是为了将来的参考。我想我以后会遇到这种情况,所以我最好现在就处理它。@Jess徒弟,#1实际上会阻止它,因为标准规定预处理器阶段发生在“正确”编译(包括创建枚举)之前。在定义枚举或使用这些符号时,它们不会作为
#define
值存在。如果您有一些源代码依赖于math.h值,但可以通过使用
math\u h.*
常量或重命名枚举字段来修复这些值,那么这将不会有帮助;预处理器不在乎,将值3和4放在标识符所在的位置。+1/@Jess徒弟:这里缺少一个关键点。。。此解决方案使用混合大小写标识符,而不是大写。除了通常用于模板参数的单大写字符和单字符+数字标识符外,所有大写标识符都应留给预处理器宏。你应该使用混合大小写或小写,两者都有细微的优点和缺点,但两者都可以避免冲突。@TonyDelroy我想我被其他语言污染了;我将所有CAP与常量的语义相关联,粗略地说,宏和编译时常量(例如枚举成员)都满足这些语义。我通常也讨厌宏(类型不安全,基本上是另一种语言的一部分),我更喜欢从我的环境中删除尽可能多的非标准宏,即使没有这个问题。@Jessuide:可以理解。。。这是直觉上的
class Flows
{
public:
    enum Value { Underflow, Overflow };
};