相关疑难解决方法(0)

宏和成员函数冲突

我有问题,std :: numeric_limits :: min()与"windef.h"中定义的"min"宏冲突.有没有办法解决这个冲突而不取消定义"min"宏.下面的链接提供了一些提示,但是我无法使用带有静态成员函数的括号.

我可以使用宏的一些技巧?

先感谢您.

c++

22
推荐指数
2
解决办法
8186
查看次数

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

我有一些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()方法?

c++ windows macros collision

17
推荐指数
3
解决办法
5703
查看次数

命名空间和定义之间的冲突

我有这个严重的问题.我在2个名称空间中有一个枚举,如下所示:

namespace FANLib {
namespace ERROR {

    enum TYPE {

        /// FSL error codes
        FSL_PARSER_FILE_IERROR,...
Run Code Online (Sandbox Code Playgroud)

在我的代码中的其他地方,我使用它像这样:

FANLib::Log::internalLog(FSLParser::FILE_IERROR, file_ierror, true, FANLib::ERROR::FSL_PARSER_FILE_IERROR);
Run Code Online (Sandbox Code Playgroud)

所有编译都很好,但如果我碰巧包含"windows.h",我会收到错误!问题出在"WinGDI.h"中,其中包含以下行:

#define ERROR               0
Run Code Online (Sandbox Code Playgroud)

并使编译器认为,在FANLib :: ...之后,有一个零!我得到的错误是:

错误1错误C2589:'常数':'::'右侧的非法令牌

错误2错误C2059:语法错误:'::'

错误3错误C2039:'FSL_PARSER_FILE_IERROR':不是'`global namespace''的成员

我可以做些什么,而不必因为一些不经意而改变我的命名空间#define?我在另一篇文章中读过我可以#undef ERROR,但这有多安全?

c++ namespaces c-preprocessor

6
推荐指数
1
解决办法
4468
查看次数

使用C++调用带有括号的函数

我发现boost中的代码类似于:

class A
{
    stats stat;
public:
    int min() const{ return (stat.min)(); }
};

...

int stats::min()
{
...
}
Run Code Online (Sandbox Code Playgroud)

为什么括号在这里?我知道它可以用于"最烦恼的解析"并禁止ADL.但也许别的什么?提前致谢!

c++

6
推荐指数
1
解决办法
969
查看次数

使用dllexport和特定函数名称时未解析的外部符号

编辑

为了解决这个问题,我将以下内容添加到头文件的开头:

#ifdef GetMessage
#undef GetMessage
static inline BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
) {
#if UNICODE
return ::GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#else
return ::GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#endif
}
#endif
Run Code Online (Sandbox Code Playgroud)

我正在从以下代码创建一个C++ DLL(使用Visual Studio 2008):

头文件:

#include <windows.h> // Edit: This is the culprit.
class __declspec(dllexport) TestBaseClass
{
protected:
   char m_Message[512];
public:
   TestBaseClass();
   virtual char* GetMessage(void) = 0;
};

class __declspec(dllexport) TestDerivedClass : public TestBaseClass
{
public:
   TestDerivedClass();
   virtual char* GetMessage(void);
};
Run Code Online (Sandbox Code Playgroud)

CPP文件:

TestBaseClass::TestBaseClass()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ dll dllexport

2
推荐指数
2
解决办法
1386
查看次数

标签 统计

c++ ×5

c-preprocessor ×1

collision ×1

dll ×1

dllexport ×1

macros ×1

namespaces ×1

windows ×1