如何使用 "using XXX" 正确转发声明结构?
How to correctly forward declare struct with "using XXX"?
有一个 header 文件 "api.h" 我必须使用,我可以 NOT 修改它,但是其中所有结构的名称太长,可读性差,命名风格也和我的项目不一样。
例如在文件 "api.h":
#pragma once
struct AVERYVERYLONGLONGNAMEOFSTRUCT1 {
...
};
struct AVERYVERYLONGLONGNAMEOFSTRUCT2 {
...
};
...
所以,我创建了另一个header"common.h",以便re-name他们。
文件"common.hpp":
#pragma once
#include "api.h"
namespace MyProject {
using ContraDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT1;
using AccountDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT2;
};
但我只想将它包含在实现文件 ( *.cpp ) 中,而不是其他 header 文件中,因为我想加快编译过程。
假设我在"myclass.hpp"中声明了一个class,并在"myclass.cpp"中实现了它。
我尝试将结构 ContraDef_t 的前向声明添加到 "myclass.hpp" 中,如下所示:
#pragma once
namespace MyProject {
struct ContraDef_t;
class MyClass_t {
MyClass_t( const ContraDef_t * );
...
};
};
然后在 "myclass.cpp":
#include "common.hpp"
#include "myclass.hpp"
namespace MyProject {
MyClass_t::MyClass_t( const ContraDef_t * pcd ) {
...
};
};
最后,我可以 NOT 通过 "error: using typedef-name ‘using ContraDef_t = struct AVERYVERYLONGLONGNAMEOFSTRUCT1’ after ‘struct’..."
的编译
我该怎么办?任何帮助或提示将不胜感激!
仅在 header 中放置前向声明并包含 header:
// common.h
// dont include api.h here !
struct AVERYVERYLONGLONGNAMEOFSTRUCT1;
using ContraDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT1;
// my_class.h
#include "common.h"
struct my_class{
ContraDef_t* c;
};
// my_class.cpp
#include "my_class.h"
#include "api.h"
// ...
有一个 header 文件 "api.h" 我必须使用,我可以 NOT 修改它,但是其中所有结构的名称太长,可读性差,命名风格也和我的项目不一样。
例如在文件 "api.h":
#pragma once
struct AVERYVERYLONGLONGNAMEOFSTRUCT1 {
...
};
struct AVERYVERYLONGLONGNAMEOFSTRUCT2 {
...
};
...
所以,我创建了另一个header"common.h",以便re-name他们。
文件"common.hpp":
#pragma once
#include "api.h"
namespace MyProject {
using ContraDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT1;
using AccountDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT2;
};
但我只想将它包含在实现文件 ( *.cpp ) 中,而不是其他 header 文件中,因为我想加快编译过程。 假设我在"myclass.hpp"中声明了一个class,并在"myclass.cpp"中实现了它。 我尝试将结构 ContraDef_t 的前向声明添加到 "myclass.hpp" 中,如下所示:
#pragma once
namespace MyProject {
struct ContraDef_t;
class MyClass_t {
MyClass_t( const ContraDef_t * );
...
};
};
然后在 "myclass.cpp":
#include "common.hpp"
#include "myclass.hpp"
namespace MyProject {
MyClass_t::MyClass_t( const ContraDef_t * pcd ) {
...
};
};
最后,我可以 NOT 通过 "error: using typedef-name ‘using ContraDef_t = struct AVERYVERYLONGLONGNAMEOFSTRUCT1’ after ‘struct’..."
的编译我该怎么办?任何帮助或提示将不胜感激!
仅在 header 中放置前向声明并包含 header:
// common.h
// dont include api.h here !
struct AVERYVERYLONGLONGNAMEOFSTRUCT1;
using ContraDef_t = AVERYVERYLONGLONGNAMEOFSTRUCT1;
// my_class.h
#include "common.h"
struct my_class{
ContraDef_t* c;
};
// my_class.cpp
#include "my_class.h"
#include "api.h"
// ...