【问题标题】:No naming conflict from two functions in global namespace (C++)?全局命名空间(C++)中的两个函数没有命名冲突?
【发布时间】:2022-01-06 21:49:56
【问题描述】:

我创建了两个文件,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++ function namespaces global


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多