如何避免与Windows头文件中定义的宏名称冲突?

Mik*_*kes 17 c++ windows macros collision

我有一些C++代码,其中包含一个名为CreateDirectory(). Previous的方法,以前代码只使用了STL和Boost,但最近我必须包括<windows.h>所以我可以查找CSIDL_LOCAL_APPDATA.

现在,这段代码:

filesystem.CreateDirectory(p->Pathname()); // Actually create it...
Run Code Online (Sandbox Code Playgroud)

不再编译:

error C2039: 'CreateDirectoryA' : is not a member of ...
Run Code Online (Sandbox Code Playgroud)

这对应于此宏winbase.h:

#ifdef UNICODE
#define CreateDirectory  CreateDirectoryW
#else
#define CreateDirectory  CreateDirectoryA
#endif // !UNICODE
Run Code Online (Sandbox Code Playgroud)

预处理器正在重新定义我的方法调用.有没有办法避免这种命名冲突?或者我必须重命名我的CreateDirectory()方法?

Joh*_*ler 14

如果你只是重命名你的CreateDirectory方法,你会更好.如果你需要使用Windows API,与Windows.h的战斗是一场失败的战斗.

很明显,如果你在包含windows.h时一致,那么仍然会编译.(虽然你可能在其他地方遇到问题).

  • 有时很难找到比 MS 取的名字更好的名字。 (2认同)

qua*_*ana 10

您可以创建一个模块,其唯一目的是#include <windows.h>查找包含在函数中的CSIDL_LOCAL_APPDATA.

int get_CSIDL_LOCAL_APPDATA(void)
{
    return CSIDL_LOCAL_APPDATA;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,为搞清楚发生的事情做得好!


rer*_*run 8

#undef CreateDirectory