全局命名空间 (C++) 中的两个函数没有命名冲突?

No naming conflict from two functions in global namespace (C++)?

我创建了两个文件,Linkage.cppExternal.cpp

Linkage.cpp:

#include <iostream>

void Log(int x = 5)
{
    std::cout << x << "\n";
}

int main()
{
    Log();
    return 0;
}

External.cpp:

#include <iostream>

void Log(const char* message)
{
    std::cout << message << "\n";
}

为什么我没有收到链接器错误?这两个函数都是在全局命名空间中定义的,因此与变量一样应该存在命名冲突。

好的,在@Retire Ninja 向我指出这一点后,我进行了实验。

首先,注释掉External.cpp中的所有代码。现在,在 Linkage.cpp 中声明另一个 Log 函数,以便此文件中有两个具有相同名称(Log)但参数不同的函数。您会意识到,根据您提供的参数,这些 Log 函数的行为将类似于不同的函数。

因此,与变量不同,变量在命名空间中相同的名称意味着相同的变量,函数也需要具有匹配的 签名

Why am I not getting a linker error?

你写的时候

void Log(int x = 5)//this means that the function named Log can be called without passing 
                  //any argument because you have provided a default argument which will be 
                 //used in case you don't provide/pass any argument
{
   //..other code here
{

以上意味着可以在不传递任何参数的情况下调用名为 Log 的函数,因为您提供了一个默认参数,如果您不 provide/pass 任何参数,将使用该默认参数。

下一步当你写

void Log(const char* message)//this means that this versoin of the function named Log will be called only if you pass an argument of type `char*` . 
{
    std::cout << message << "\n";
}

上面的意思是这个名为 Log 的函数的版本将被调用 仅当 您传递类型为 char* 的参数时 [=17] =]

现在当你写道:

 Log();

将使用具有默认参数的第一个版本,因为您没有提供任何参数,因此可以使用第一个版本(因为它 可行)并且因为第二个必须带参数的版本是不可行