C++ - 日食 - 组织包含

C++ - Eclipse - Organize include

本文关键字:包含 日食 C++      更新时间:2023-10-16

我定义了一个类Executer分为Executer.hppExecuter.cpp

Executer.hpp有代码:

static std::unique_ptr<Executer> mInstance;
static std::once_flag mOnceFlag;

Executer.cpp有代码:

std::unique_ptr<Executer> Executer::mInstance;
std::once_flag Executer::mOnceFlag; // without this apparently
    // useless line of code, the program using this shared lib
    // claims: undefined reference to `Executer::mOnceFlag'

之后,我尝试让 eclipse 组织我的导入。

我得到的是:

//------------------------------- Executer.hpp
#include <memory>
#include <stdexcept>
#include <string>
namespace std {
struct once_flag;
} /* namespace std */
//------------------------------- Executer.cpp
#include "Executer.hpp"    
#include <mutex>

我所期望的(并且编译正确):

//------------------------------- Executer.hpp
#include <memory>
#include <mutex>
#include <stdexcept>
#include <string>
//------------------------------- Executer.cpp    
#include "Executer.hpp"    
  1. 为什么 Eclipse 会以这种方式行事?
  2. 我是否可以以这样一种方式配置 Eclipse,以便我获得组织包含的方式(我已经看到了许多选项,但我遇到了最糟糕的情况)

为什么 Eclipse 会以这种方式行事?

静态数据成员

的类型不需要在数据成员的声明点完成。也就是说,声明将使用刚刚向前声明的类型进行编译,而不是定义的类型。

"Organize Include"的默认设置尝试最小化其他标头中包含的标头数,以加快编译时间,因此当类型的前向声明足够时,它更喜欢创建一个而不是包含标头而不是定义类型。

我是否可以以这样一种方式配置 Eclipse,以便我获得组织包含的方式(我已经看到了许多选项,但我遇到了最糟糕的情况)

取消选中Preferences | C/C++ | Code Style | Organize Includes中的Forward declare classes, structs and unions应该会给你你想要的行为。