【发布时间】:2022-01-19 12:32:03
【问题描述】:
假设我们有一个源文件 A.cpp,我们在其中转发声明了一个类型 ClassB,然后我们继续使用指向 ClassB 的指针,而没有 #include 文件 B.cpp(其中定义了 ClassB);在 B.cpp 中,我们转发声明 ClassA 并使用指向它的指针,而无需 #include A.cpp (其中定义了 ClassA),那么编译器对此是否完全满意?符号解析能正常工作吗?换句话说,这两个目标文件在链接时间之前是否根本不需要相互了解?
(我假设在 Visual Studio 上编译 C++ 代码而不对默认编译器进行任何更改)
PS:
文件 A.cpp
class ClassB;
class ClassA
{
bool JustTakeAClassBPointAndDoNothingWithIt(ClassB* class_b_pointer)
{
if(class_b_pointer)
return true;
else
return false;
return false;
}
}
文件 B.cpp
class ClassA;
class ClassB
{
bool JustTakeAClassAPointAndDoNothingWithIt(ClassA* class_a_pointer)
{
if(class_a_pointer)
return true;
else
return false;
return false;
}
}
【问题讨论】:
-
这太模糊笼统,无法给出权威答案。 C++ 是当今使用的最复杂的通用编程语言。当您不知道时,回答“这行得通”的唯一方法是尝试一下。附言除非出现编译器错误,否则您的编译器是否是“没有对默认编译器进行任何更改的 Visual Studio”,完全无关紧要。 C++ 就是 C++。
-
“那么我们继续使用指向 ClassB 的指针”是否意味着您只是传递指针并在其上执行通用指针操作;还是您的意思是,通过该指针访问特定于 ClassB 的任何内容?后者仅在您包含 B 的定义文件时才有效(我认为)
-
@SamVarshavchik 你确定你仔细阅读了吗?我不同意你的描述。尽管如此,感谢您的宝贵时间。
-
那么我看不出你为什么不应该只使用前向声明。但是如果没有明确的代码示例就很难说 ;)
-
非常相关:stackoverflow.com/questions/44963201/…。诚然,我不明白为什么答案说很难说。其实很简单:前向声明的类型是不完整的,你不能做任何需要完整类型的事情,就是这样
标签: c++ linker include forward-declaration link-time-optimization