修复循环依赖 c++17 头文件

Fixing circular dependencies c++17 headers

我正在使用 clang C++17 编译器并且收到警告:

declaration of 'struct Xchart' will not be visible outside of this function. 

此警告指向一个函数声明,该函数声明使用了在不同头文件中声明的结构。我相信这是由两个头文件中的循环依赖引起的,但我无法解决警告

Header toolkit.h 声明函数 MyFunction,它使用结构 Xchart 作为输入。这是警告点。

toolkit.h

#ifndef _TOOLKIT_H
#define _TOOLKIT_H 1

#define _WINDOWS 1
#include <windows.h>

short WINAPI MyFunction(struct Xchart *mychart ); <--Warning Here

#pragma pack(push, 1)
#pragma pack(pop)
#endif /*_TOOLTKIT_H */

表头mystruct.h声明Xchart结构

mystruct.h

#ifndef _mystructs_h
#define _mystructs_h 1

#include "toolkit.h"

#pragma pack(push, 1)

struct Xchart { 
  int MyDays;   
  short LoadMe;   
  wchar_t MyLabel[100]; 
};

#pragma pack(pop)
#endif /* _mystructs_h */

您能否展示如何更改这两个头文件以解决警告?

有两个不同的问题。

1) 下面 struct 关键字在这里有问题:

short WINAPI MyFunction(struct Xchart *mychart )

应该像下面这样Xchart应该在这之前声明:

short WINAPI MyFunction(Xchart *mychart )

从声明中删除关键字。

2) 您必须反转 header 包含。 mystruct.h 应包含在 toolkit.h 中。因为你想使用mystruct.h中定义的结构。从我的 strict.h.

中删除 toolkit.h

通常的修复很简单:

struct Xchart; // declares Xchart; definition is elsewhere.
short WINAPI MyFunction(Xchart *mychart); // Function declaration.

只有 toolkit.cpp 需要 Xchart 的定义,但 .cpp 文件本身不包含在其他地方,也不会导致循环包含。