Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ windows标头中的入侵定义_C++_Winapi - Fatal编程技术网

C++ windows标头中的入侵定义

C++ windows标头中的入侵定义,c++,winapi,C++,Winapi,处理windows标题中的侵入性定义的最佳方法是什么?当我真的需要用相同的名称定义一个符号时,无论它是否在名称空间中,它们都会发出错误。我知道有些定义可以用WIN32_LEAN_和_MEAN避免,但不是全部。在这个特殊的例子中,我在WinNT.h#6478中找到了一个“DELETE”定义——有很多像这样的非常通用的关键字 我的直接想法是在声明常数之前进行#undef,但这是一个非常不公平的解决方案。我不能轻易地重命名我的常量,因为它们被直接翻译成文本字符串,我需要这些字符串与现在的一样 想到的其

处理windows标题中的侵入性定义的最佳方法是什么?当我真的需要用相同的名称定义一个符号时,无论它是否在名称空间中,它们都会发出错误。我知道有些定义可以用WIN32_LEAN_和_MEAN避免,但不是全部。在这个特殊的例子中,我在WinNT.h#6478中找到了一个“DELETE”定义——有很多像这样的非常通用的关键字

我的直接想法是在声明常数之前进行#undef,但这是一个非常不公平的解决方案。我不能轻易地重命名我的常量,因为它们被直接翻译成文本字符串,我需要这些字符串与现在的一样


想到的其他定义还有windowsx.h中的GetFirstChild/GetNextSibling。。。真的吗?

事实上,我认为最干净的解决方案是提供一个包装头,它将
#包括
#undef
所有妨碍您的宏。然后,您将包含此包装头,而不是
windows.h

显而易见的解决方案是不包含
。那里 应该是非常非常少的需要它的模块, 您只需避免使用
定义的符号即可。 这应该不会太难,因为它们会很低 水平包装,不需要包括你的任何东西
应用程序

我的解决方案是“除非绝对必要,否则不要包含
”。通常,您希望将系统依赖项隔离到一小部分代码,因此在文件中随意包含
是一个坏主意

也许您可以将自己的#defines的使用隔离到不需要包含
#的源文件中?我没有使用defines,我只是在名称空间中声明常量,但这并不阻止它们与microsoft defines冲突。显然,我需要从项目的不同部分访问常量,因此它们位于头文件中,不可避免地,一些需要windows.h的源文件也将包含它。这就是为什么不应该用大写字母命名那些不是预处理器宏的东西。所有大写名称应保留给预处理器宏;这种做法被扭曲成以大写命名所有常量是不幸的。我喜欢这种想法,尽管我想我必须看看这个问题有多大,并且可能会在一个导致冲突的文件中保留undef。问题是,如果我的程序的一端有我的常量,而在另一端,我有窗口标头,中间必须有一个桥,两者都必须使用。可能还有其他问题要解决,是的。但一般的原则是将系统依赖关系保留在一小部分文件中,但如果这样做,则存在一个重大的潜在问题
用宏定义了数百个名称,其中许多是合理的函数名(典型的问题是
附加了A或W)。如果在头中使用其中一个名称作为成员函数的名称,则可能会在源文件中使用该名称的两个不同版本,具体取决于您是否使用了
#include
d
。这通常显示为链接错误,因为定义成员函数的源文件给它的名称与您声明的名称不同。@PeteBecker Yes。您必须在包装器的实现文件中避免使用这些名称(这是唯一应该包含
的文件)。这是Windows下编程的限制之一。但是如果包装相对来说足够薄,它们就不会定义很多符号。冲突通常会阻止代码编译,因此您会注意到它们。(我在这里假设您遵循一般推荐的做法,将要实现的内容的标题包含在其他内容之前,包括