gpt4 book ai didi

c++ - 类的编译是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:07 26 4
gpt4 key购买 nike

有很多关于编译/链接过程的引用资料,但我对一个更具体的问题感兴趣:类的编译。

问题的出现是因为一般情况下,在使用之前必须了解事物。例如:如果之前没有声明过,则不能调用该函数。

在类里面,它不是以同样的方式完成的。您可以在成员出现之前使用它。编译器做什么?该标准是否说明了前一阶段的编译?

更具体地说,以下示例显示了我们如何使用下面定义的成员。

#include <iostream>

class EvenOdd {
public:
EvenOdd(): value(0) {}

void assignEven(unsigned v) {
if (v>0 && v%2==1) {
std::cout << "Wrong call... is odd" << std::endl;
assignOdd(v);
}
else {
std::cout << "Right..." << v << " is Even" << std::endl;
value= v;
}
}
void assignOdd(unsigned v) {
if (v>0 && v%2==0) {
std::cout << "Wrong call... is even" << std::endl;
assignEven(v);
}
else {
std::cout << "Right..." << v << " is Odd" << std::endl;
value= v;
}
}
private:
unsigned value;
};

int main()
{
EvenOdd a;
std::cout << "Do it right..." << std::endl;
a.assignEven(2);
std::cout << "doing it wrong..." << std::endl;
a.assignEven(3);
}

我们还可以添加有关内联函数的更多问题,因为它们可能在调用点之后定义,编译器可以毫无问题地解决。我想答案是相关的。

更新:我知道编译/链接有几个步骤。另一方面,如果编译器接受调用下面定义的函数是因为编译器在某种意义上分析了代码。问题是“之前完成了哪种前一阶段?此外...我们在标准的哪一部分中找到了与使用下面定义的成员相关的内容?

了解编译器的工作原理非常有趣,因为它必须了解似乎与实际编译对应的函数的详细信息(至少,头文件)。甚至数据成员也必须编译,因为您必须在上面函数的上下文中关联它的类型

它的工作方式就像代码被重新排序但它与上面的示例不一致,因为两个函数成员相互调用。这就像重新排序数据成员和函数头可能是编译器考虑的代码。

最佳答案

标准说

A class is considered a completely-defined object type (3.9) (or complete type) at the closing } of the class-specifier. Within the class member-specification, the class is regarded as complete within function bodies, default arguments, exception-specifications, and default member initializers (including such things in nested classes). Otherwise it is regarded as incomplete within its own class member-specification.

这特别意味着成员函数体可以引用在它下面声明的类成员。该标准不关心实现如何实现这一点。一种可能的方法是推迟对成员函数体和上面指定的其他元素的语义分析,直到看到类的右括号为止。

关于c++ - 类的编译是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38455480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com