c++ - 命名空间内的宏在 'do' 错误之前给出预期的 unqualified-id

标签 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:
        static void func(){cout << "called from MACRO\n";}
    };
}

int main() {
    A::MACRO("something"); //note: in expansion of macro ‘MACRO’
    return 0;
}

我还尝试使用另一种格式定义宏,例如

#define MACRO(message) \
( \
   { \
      B::func() \
   } \
 )

但同样的错误。这是link一个最小的工作示例。

This让我想到以这种方式使用宏。但在这个问题中没有使用任何类,正如我提到的,这是我想要实现的目标的简化版本。

最佳答案

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

您可以在命名空间内定义宏,但您将使用非限定名称:

namespace n {
#define MACRO(x)
}

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

关于c++ - 命名空间内的宏在 'do' 错误之前给出预期的 unqualified-id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47476129/

相关文章:

c++ - 超出限制时进行类型转换

c++ - 有没有一种通用的方法可以用 C++ 检测文件写入错误?

c++ - 如何高效统计定义指针的个数?

c++ - 混淆的引用输出,如何分析?

c++ - 接收通用 map 作为参数的模板函数

c++ - 在将字符串转换为 ptime 时使用 %f 标志 boost ptime input_facet 错误

c++ - 应用程序之间的共享代码

c++ - 用另一个文件替换一个文件,但保持文件同名。

c++ - DirectX 项目模板在 Visual Studio 2017 中不可见

c++ - 如何读取纹理数据以便进行编辑?