提问人:Abhinav Jha 提问时间:11/30/2021 更新时间:11/30/2021 访问量:92
全局命名空间 (C++) 中的两个函数没有命名冲突?
No naming conflict from two functions in global namespace (C++)?
问:
我创建了两个文件,然后 .Linkage.cpp
External.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";
}
为什么我没有收到链接器错误?这两个函数都是在全局命名空间中定义的,因此应该与变量一样存在命名冲突。
答:
0赞
Abhinav Jha
11/30/2021
#1
好吧,在忍者向我指出这一点后@Retire我进行了实验。
首先,注释掉 中的所有代码。现在,在里面声明另一个函数,以便这个文件中有两个函数具有相同的名称(Log)但参数不同。您将意识到,根据您提供的参数,这些函数的行为将类似于不同的函数。External.cpp
Log
Linkage.cpp
Log
因此,与变量不同,在命名空间中,相同的名称意味着相同的变量,函数也需要具有匹配的签名。
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";
}
以上意味着,仅当您传递 类型的参数时,才会调用名为 的函数的这个版本。Log
char*
现在当你写道:
Log();
将使用具有默认参数的第一个版本,因为您没有提供任何参数,因此可以使用第一个版本(因为它是可行的),并且因为必须接受参数的第二个版本是不可行的。
评论
int foo();
double foo();