C++ 命名空间内的宏,在';do';错误

C++ 命名空间内的宏,在';do';错误,c++,C++,我试图在名称空间中使用宏来记录文件名和行号。 下面是生成错误的代码的简化版本 #include <iostream> using namespace std; namespace A { #define MACRO(a) \ do { \ //error: expected unqualified-id before 'do' B::func() \ } while(0) class B { public:

我试图在名称空间中使用宏来记录文件名和行号。 下面是生成错误的代码的简化版本

#include <iostream>
using namespace std;

namespace A
{
    #define MACRO(a) \
    do { \      //error: expected unqualified-id before 'do'
    B::func() \
    } while(0)

    class B
    {
    public:
        static void func(){cout << "called from MACRO\n";}
    };
}

int main() {
    A::MACRO("something"); //note: in expansion of macro ‘MACRO’
    return 0;
}
但同样的错误。下面是一个简单的工作示例


给了我这样使用宏的想法。但是在这个问题上,没有使用类,正如我提到的,这是我试图实现的简化版本。

宏是一个预处理概念。预处理器没有名称空间的概念

您可以在名称空间中定义宏,但将其与非限定名称一起使用:

namespace n {
#define MACRO(x)
}

int main()
{
    MACRO("something");
}

宏是预处理器指令(并通过纯文本替换工作),您不能将它们限定到名称空间,因为宏不尊重名称空间。它们甚至在解析名称空间之前就被解析了。因此这就变成了
A::do{…}
,这显然是错误的。“获取文件名和行号”:如果您有空,您可以使用。可能值得一试read@Ext3h感谢您的具体解释。这解决了错误消息,但随后我得到了错误消息错误:“B”尚未声明。要解决这个问题,我必须在宏中使用名称空间名称,比如A::B::func()@masterop您需要定义宏才能使用
A::B::func
;)
namespace n {
#define MACRO(x)
}

int main()
{
    MACRO("something");
}