C++ 使用多个.cpp文件时调用函数

C++ 使用多个.cpp文件时调用函数,c++,inline,function-call,C++,Inline,Function Call,当我调用一个内联函数时,我想问一个关于输出的问题,该函数在MyHeader.h中声明,MyHeader.h在source_1.cpp和source_2.cpp文件中都定义了,使用source_2.cpp文件中的int main函数 当我执行这样的调用时,将调用在source_1.cpp函数中定义的调用。代码如下: MyHeader.h包含以下代码行: #pragma once #include <iostream> inline int func(void); #include

当我调用一个内联函数时,我想问一个关于输出的问题,该函数在MyHeader.h中声明,MyHeader.h在source_1.cpp和source_2.cpp文件中都定义了,使用source_2.cpp文件中的int main函数

当我执行这样的调用时,将调用在source_1.cpp函数中定义的调用。代码如下:

MyHeader.h包含以下代码行:

#pragma once
#include <iostream>

inline int func(void);
#include "MyHeader.h"

int func(void)
{
    std::cout << "func(), inside source_1, was called. 102 * 102 will be returned." << "\n";
    return 102 * 102;
}

void source_1(void)
{
    std::cout << "source_1() was called. func() will be called." << "\n";
    func();
}
#include "MyHeader.h"

int func(void)
{
    std::cout << "func(), inside source_2, was called. 102 * 102 will be returned." << "\n";
    return 102 * 102;
}

void source_2(void)
{
    std::cout << "source_2() was called. func() will be called." << "\n";
    func();
}


int main()
{
    std::cout << "main() was called." << "\n";
    source_2();
}
My source_2.cpp包含以下代码行:

#pragma once
#include <iostream>

inline int func(void);
#include "MyHeader.h"

int func(void)
{
    std::cout << "func(), inside source_1, was called. 102 * 102 will be returned." << "\n";
    return 102 * 102;
}

void source_1(void)
{
    std::cout << "source_1() was called. func() will be called." << "\n";
    func();
}
#include "MyHeader.h"

int func(void)
{
    std::cout << "func(), inside source_2, was called. 102 * 102 will be returned." << "\n";
    return 102 * 102;
}

void source_2(void)
{
    std::cout << "source_2() was called. func() will be called." << "\n";
    func();
}


int main()
{
    std::cout << "main() was called." << "\n";
    source_2();
}

我想知道原因。

您的source_2函数称为source_1.cpp的func函数,因为func被声明为内联函数,而不是静态函数。当链接器获得内联函数时,它会删除该函数的所有副本,只有一个副本除外。因此,source_1.cpp的func函数被保留,另一个被链接器删除。如果希望在两个源文件中有一个函数的两个单独实现,请将该函数声明为静态。这将防止链接器删除多个同名函数。

您违反了。不允许在程序中使用不同实现的非静态对象。编译器/链接器可以自由选择它找到的任何实现,这可能导致很难找到bug。

您能告诉我图片中的内容吗?不幸的是,我是个盲人,我的屏幕阅读器在那里只会胡言乱语。调用了源_2。func将被调用。调用了源_1中的func。102*102将被返回。您不能在您的问题中把文本作为格式化的代码吗?调用了main。调用了源_2。func将被调用。调用了源_1中的func。将返回102*102。现在好了吗?如果您从问题中删除图像并在问题中添加带有代码格式的输出,这将非常有帮助。谢谢您的回答。我有点忙,将编辑代码。再次感谢。@AhmetKandemirPEHLİVANLI如果我的回答对你有帮助,请接受。