C++ 混淆#定义清除();及;std::wstring::clear();

C++ 混淆#定义清除();及;std::wstring::clear();,c++,C++,我包括了“PDCurses/curses.h”,它定义了一个函数“clear()”,然后当我使用“std::wstring::clear()”时,msvc-10.0编译器会报告错误。包含后,当我“#undef clear()”时,它已修复。代码如下所示: inline void str_clear( std::wstring& wstr ) { wstr.clear(); } 我使用了“std::”但是为什么编译器仍然让人困惑? 这可能是由多定义的“名称空间”引起的吗?原因是

我包括了“PDCurses/curses.h”,它定义了一个函数“clear()”,然后当我使用“std::wstring::clear()”时,msvc-10.0编译器会报告错误。包含后,当我“#undef clear()”时,它已修复。代码如下所示:

inline void str_clear( std::wstring& wstr ) 
{
    wstr.clear();
}
我使用了“std::”但是为什么编译器仍然让人困惑?
这可能是由多定义的“名称空间”引起的吗?

原因是预处理器基本上对定义的所有宏进行搜索和替换。它是在编译器正确获取代码之前完成的,它一般不知道任何名称空间、类或范围

所以如果你有,例如

#define clear()  something
然后使用

wstr.clear();
预处理器将替换
clear()

wstr.something;

原因是预处理器基本上对定义的所有宏进行搜索和替换。它是在编译器正确获取代码之前完成的,它一般不知道任何名称空间、类或范围

所以如果你有,例如

#define clear()  something
然后使用

wstr.clear();
预处理器将替换
clear()

wstr.something;

预处理器不关心类型或名称空间,它盲目地替换内容
clear()
放在头中是一个蹩脚的宏。如果它是一个
#define
,那么它只会在编译之前用其他东西替换
clear(…)
。也可以通过重写代码,使
clear()
不会以字面形式出现,例如
(wstr.clear)()
。预处理器不关心类型或名称空间,它盲目地替换内容
clear()
放在头中是一个蹩脚的宏。如果它是一个
#define
,那么它只会在编译之前用其他东西替换
clear(…)
。也可以通过重写代码,使
clear()
不会以字面形式出现,例如
(wstr.clear)()
。编译器不从“wstr”类型进行搜索?@NFDream:编译器会;但宏是由预处理器扩展的,预处理器对类型、作用域或语言语法的任何其他方面一无所知。它只是在编译器执行任何操作之前用其他标记替换标记。这就是为什么如果可能,您应该远离宏的原因。这也是许多C/C++书籍建议您通过将宏全部命名为大写来为宏创建单独名称空间的方式;但宏是由预处理器扩展的,预处理器对类型、作用域或语言语法的任何其他方面一无所知。它只是在编译器执行任何操作之前用其他标记替换标记。这就是为什么如果可能,您应该远离宏的原因。这也是许多C/C++书籍建议您通过将宏全部命名为大写来为宏创建单独名称空间的方法。