将 typedef 转发声明到原始类型
Forward Declaration of a typedef to a Primitive Type
在我的文件中说我想做的事情:
typedef vector<foo> foos
如果 foo
是另一个文件中的 class,我可以转发声明:class foo
。但是,如果 foo
本身就是原语的 typedef
,我不知道该如何处理。例如,在我完成的另一个文件中说:
typedef int foo
我唯一的选择是 #include
文件 foo
在 typedef
中,还是 typedef vector<int> foos
?为了可读性和关联性,我宁愿避免这两种选择。还有什么我可以做的吗?
编译器必须知道分配类型的大小才能构建代码。
解决方案是使用句柄的语义,例如。
它们通常是无效的*。
当大小合适时,您可以将它们转换为数字。
typedef void* foohandle;
reinterpret_cast<foohandle>(foo);
reinterpret_cast<int32_t>(foo handle);
但更好的做法是使用句柄作为具体类型的指针。
中多次执行相同的操作 typedef
Once declared, a typedef-name may only be redeclared to refer to the same type again [1]
因此,就像您使用 class foo
转发声明 foo
一样,如果它是一种类型,您也可以这样做:
typedef int foo
那么你的 typedef vector<foo> foos
就可以正常编译了。这不会违反 Single Source of Truth 的原则,因为编译器会强制所有 typedef
匹配。如果您决定更改类型,那么您还需要编辑所有定义它的文件以匹配。
在我的文件中说我想做的事情:
typedef vector<foo> foos
如果 foo
是另一个文件中的 class,我可以转发声明:class foo
。但是,如果 foo
本身就是原语的 typedef
,我不知道该如何处理。例如,在我完成的另一个文件中说:
typedef int foo
我唯一的选择是 #include
文件 foo
在 typedef
中,还是 typedef vector<int> foos
?为了可读性和关联性,我宁愿避免这两种选择。还有什么我可以做的吗?
编译器必须知道分配类型的大小才能构建代码。
解决方案是使用句柄的语义,例如。
它们通常是无效的*。
当大小合适时,您可以将它们转换为数字。
typedef void* foohandle;
reinterpret_cast<foohandle>(foo);
reinterpret_cast<int32_t>(foo handle);
但更好的做法是使用句柄作为具体类型的指针。
typedef
Once declared, a typedef-name may only be redeclared to refer to the same type again [1]
因此,就像您使用 class foo
转发声明 foo
一样,如果它是一种类型,您也可以这样做:
typedef int foo
那么你的 typedef vector<foo> foos
就可以正常编译了。这不会违反 Single Source of Truth 的原则,因为编译器会强制所有 typedef
匹配。如果您决定更改类型,那么您还需要编辑所有定义它的文件以匹配。