当我用opt -analyze -dot-callgraph
生成一个点调用图时,会生成两个“特殊”节点,一个带有名称/标签external node
,一个没有分配标签。
这些代表什么?
编辑:在这个愚蠢的示例中:
#include <cstdio>
class Animal
{
public:
virtual void speak() = 0;
};
class Dog : public Animal
{
public:
void speak() override { printf("Woof!\n"); }
};
class Cat : public Animal
{
public:
void speak() override { printf("Meow!\n"); }
};
class Programmer : public Animal
{
public:
void speak() override { printf("Hello, world!\n"); }
};
int main()
{
Animal *dog = new Dog;
Animal *cat = new Cat;
Animal *guy = new Programmer;
dog->speak();
cat->speak();
guy->speak();
delete dog;
delete cat;
delete guy;
}
当生成一个调用图时,我们会遇到external node
调用所有speak
实现的情况。为什么呢?只有main
呼叫他们;外面的东西怎么能叫他们?
我们还看到main
调用了“无名”节点。这是什么意思?
如果我们将speak
中纯净的Animal
替换为:
virtual void speak() { printf("Generic animal sound!\n"); }
然后,调用图不再显示main
调用任何speak
函数,但显然会调用它们。