全局命名空间(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";
}
为什么我没有收到链接器错误?这两个函数都是在全局命名空间中定义的,因此应该像使用变量一样存在命名冲突。
为什么我没有得到链接器错误?
当你写时
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";
}
上面的意思是,只有当传递类型为char*
的参数时,才会调用名为Log
的函数的此版本。
现在当你写下:
Log();
将使用具有默认参数的第一个版本,因为您没有提供任何参数,因此可以使用第一个版本(因为它是可行(,并且因为必须采用参数的第二个版本是不可行。
好吧,在@Retire Ninja向我指出这一点后,我四处实验。
首先,注释掉External.cpp
中的所有代码。现在,在Linkage.cpp
中声明另一个Log
函数,以便在该文件中有两个名称(Log(相同但参数不同的函数。您将意识到,根据您提供的参数,这些Log
函数的行为将类似于不同的函数。
因此,与变量不同,在变量中,相同的名称意味着命名空间中的相同变量,函数也需要具有匹配的签名。
相关文章:
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 两个父类的构造函数的序列
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- 如何从两个不同的函数传递参数
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 如何比较两个函数的速度和性能
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 有一个构造函数,但有两个析构函数
- 为什么系统日志有两个不同的函数声明?
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- C++ 关于两个类构造函数的问题
- 如何创建两个具有相同名称和不同返回类型并基于布尔参数运行的函数
- 如何在构造器的成员初始值设定项列表中调用两个函数?
- 如何将这两个函数组合成一个实现?
- 将函数两个向量合并为第三个向量
- C++朋友函数两个数字的加法