如何防止C++宏替换类成员?

问题描述 投票:0回答:1

我正在构建一个Linux内核模块,源代码是基于C++的。 名为

A.cpp
的 src 文件之一始终构建失败。
A.cpp
间接包含两个头文件:依次为
asm/current.h
bits/stl_iterator.h

asm/current.h
中有宏定义:

#define current get_current()

同时,

bits/stl_iterator.h
中有一个C++类定义:

 template<typename _Iterator>
    class reverse_iterator
    {
    protected:
      _Iterator current;
      ...
    public:
      ...
      _GLIBCXX17_CONSTEXPR
      reverse_iterator() : current() { }
    }

不幸的是,C++ 类中的

current
在预处理阶段被
get_current()
替换,因此在编译阶段会报告语法错误。

那么,有没有什么方法可以在不改变这两个头文件的情况下解决这个问题呢?它们由标准 C++ 库或 Linux 内核源代码提供。

为了避免这个问题,我知道我们可以使用

#undef current
,或者更改包含顺序,但这不应该是问题的合理解决方案。

c++ gcc macros c-preprocessor
1个回答
3
投票
如果宏

asm/current.h

 未定义,则包含 
__ASSEMBLY__
。您可以在 A.cpp 之上
#define __ASSEMBLY__

我同意评论,最好的解决方案是

// A.cpp
// #include system/linux files here

#undef current

// #include C++ files here
© www.soinside.com 2019 - 2024. All rights reserved.