Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件之间的链接-它究竟是如何工作的?_C++ - Fatal编程技术网

C++ 文件之间的链接-它究竟是如何工作的?

C++ 文件之间的链接-它究竟是如何工作的?,c++,C++,因此,我一直在阅读这篇文章,但找不到任何可以向我解释以下代码行为的内容: header.hpp: class TESTING{ private: int num; public: TESTING(int); }; void testing(int, int); def.cpp: #include "header.hpp" #include <iostream> using namespace std; TESTING::TESTING(int num = 1

因此,我一直在阅读这篇文章,但找不到任何可以向我解释以下代码行为的内容: header.hpp:

class TESTING{
private:
    int num;

public:
    TESTING(int);
};

void testing(int, int);
def.cpp:

#include "header.hpp"
#include <iostream>

using namespace std;

TESTING::TESTING(int num = 100){
    this->num = num;
    cout << "init with: " << this->num << endl;
}

void testing(int a = 500, int b = 200){
    cout << "a: " << a << ", b: " << b << endl;
}

int main(){
    TESTING test1;
    TESTING test2(5);
    testing();
    testing(1);
    testing(1, 2);
}
我会得到上面评论中提到的错误,但仍然是输出:
初始值为:5
a:1,b:2 这意味着它确实链接到def.cpp,但具有某种最低可见性(?)。
为什么会这样? 这个main .CPP文件的目的是要运行这个项目中的所有其他C++文件的主要功能,有没有比我尝试的方式更强大的> <强> >更好的方法?如果是,这种方式是否适用于此处提到的代码?还是我的代码写得不好


< P> S:我是C++新手,请保持温和:D< /P> < P>默认参数不在源文件中神奇地传递。想想看——编译器处理main.cpp应该如何知道,在不同的源文件中,您为某些参数提供了默认参数

在形式上,默认参数特定于任何给定范围:

8.3.6/4对于非模板函数,可以在同一范围内函数的后续声明中添加默认参数。声明 不同的作用域具有完全不同的默认参数集

即使在同一个源文件中,也可以声明同一个函数在不同的作用域中具有不同的默认参数。编译器很乐意替换当前范围中可见的声明指定的任何默认参数(如果有)



在一个不相关的注释中,“链接”这个词是一个艺术术语,它在C++中有非常特殊的含义。这个链接的概念在很大程度上与你的问题无关,至少在它与默认参数相关的情况下是如此(我只是为了读者的利益而指出它,读者可能会被问题的标题弄糊涂)。默认参数集不是函数名或签名的一部分,并且不会影响其链接、跨作用域和转换单元使用的能力。

u r谈论默认参数。默认参数必须在使用它的地方可见。这就是为什么每个人都在标题中写它,通常你不能有编译错误和运行时输出…也许我应该说得更清楚。这段代码会在我稍后添加“/”以使其其余部分正常工作的那些行中出现错误而崩溃。您得到的错误与链接无关,而是在编译过程中出现的错误,而编译过程是在链接之前发生的。问题只是可见性,因为您试图使用main.cpp中未在该文件中声明的内容。好的,因此在不同的位置使用默认参数(例如本例中的header.hpp)可以修复此代码,但是这些函数中的其余内容呢?它如何知道它应该到达def.cpp,而没有任何东西暗示它甚至存在?作为对那个无关注释的回应:我觉得很奇怪,我在其他地方找不到这样一个问题,这个关键字是:P你在这里使用什么术语?@MrGuy:header.cpp(
void testing(int,int);
)中的声明告诉它函数存在。这就是宣言的目的!然后链接器会自动为您定位该函数,并在def.cpp中找到它;它可以这样做,因为函数有名称等等。啊,这就是“链接”的概念:“一个名称被称为有链接,当它可能表示与另一个范围中的声明引入的名称相同的对象、引用、函数、类型、模板、命名空间或值时”(这包括“在另一个源文件中”)。当然,这是链接器的工作,而不是编译器的工作,当它从单独编译的翻译单元中汇编出最终程序时,解析对同一函数的引用,比如说,对所述函数的实际实现的引用。请注意,默认参数集不是名称或函数签名的一部分。
#include "header.hpp"

int main(){
    //TESTING test1;//error: assumed to be default constructor
    TESTING test2(5);
    //testing();//error: too few arguments
    //testing(1);//error: too few arguments
    testing(1, 2);
}