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

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

提问人:Abhinav Jha 提问时间:11/30/2021 更新时间:11/30/2021 访问量:92

问:

我创建了两个文件,然后 .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";
}

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

C++ 函数 命名空间 全局

评论

1赞 Retired Ninja 11/30/2021
为什么会有冲突?它们没有相同的签名。
0赞 Abhinav Jha 11/30/2021
你能解释一下吗?什么是函数签名?
2赞 Retired Ninja 11/30/2021
为了使两个函数被视为相同,它们需要具有相同的名称和参数。你知道什么是函数重载吗?在 C++ 中,函数重载通常是如何实现的?
1赞 Ted Lyngmo 11/30/2021
它们甚至可能位于同一文件中。没关系。
0赞 Ted Lyngmo 11/30/2021
但请注意,函数的返回类型通常无关紧要。例如,不能同时拥有 和 。这将导致歧义。更多内容请见:返回类型是函数签名的一部分吗?int foo();double foo();

答:

0赞 Abhinav Jha 11/30/2021 #1

好吧,在忍者向我指出这一点后@Retire我进行了实验。

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

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

1赞 user12002570 11/30/2021 #2

为什么我没有收到链接器错误?

当你写的时候

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

接下来,当你写的时候

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";
}

以上意味着,仅当您传递 类型的参数时,才会调用名为 的函数的这个版本。Logchar*

现在当你写道:

 Log();

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