全局命名空间 (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";
}
为什么我没有收到链接器错误?这两个函数都是在全局命名空间中定义的,因此与变量一样应该存在命名冲突。
好的,在@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();
将使用具有默认参数的第一个版本,因为您没有提供任何参数,因此可以使用第一个版本(因为它 可行)并且因为第二个必须带参数的版本是不可行。
我创建了两个文件,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";
}
为什么我没有收到链接器错误?这两个函数都是在全局命名空间中定义的,因此与变量一样应该存在命名冲突。
好的,在@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();
将使用具有默认参数的第一个版本,因为您没有提供任何参数,因此可以使用第一个版本(因为它 可行)并且因为第二个必须带参数的版本是不可行。