在Visual C ++中使用不同文件和不同命名空间中的函数

时间:2016-06-08 05:35:12

标签: c++ visual-c++

我正在努力完成我在C ++中的第一步。已经问过this问题,但没有得到关于命名空间的完整答案。

我做了以下事情。

  1. 在Visual Studio 2015中创建的是空项目(新项目 - > Visual C ++ - >空项目)
  2. 然后我在Source.cpp和PrintFunc.cpp中添加了两个文件,其内容如下:
  3. Source.cpp

    #include <iostream>
    
    using namespace std;
    
    int PrintHello();
    extern int tempCount;
    
    void main()
    {
        int i;
        PrintHello();
        cout << tempCount << endl;
        cout << "Hello from main" << endl;
    }
    

    PrintFunc.cpp

    #include <iostream>
    
    using namespace std;
    
    int tempCount = 111;
    
    int PrintHello()
    {
        cout << "Hello from Source1" << endl;
        return 0;
    }
    

    这是完美的编译。 现在我正在学习命名空间,所以我只是尝试将第二个文件的内容放在命名空间中,如下所示。

    PrintFunc.cpp(已修改)

    #include <iostream>
    
    using namespace std;
    
    namespace MyNameSpace
    {
        int tempCount = 111;
    
        int PrintHello()
        {
            cout << "Hello from Source1" << endl;
            return 0;
        }
    }
    

    现在我修改了Source.cpp,以反映前面片段中的命名空间介绍。

    #include <iostream>
    
    using namespace std;
    
    int MyNameSpace::PrintHello();
    extern int MyNameSpace::tempCount;
    
    void main()
    {
        int i;
        PrintHello();
        cout << tempCount << endl;
        cout << "Hello from main" << endl;
    }
    

    这根本就不能编译。有人可以请你纠正我。我的目标是在c ++中理解命名空间概念。我也有很好的exp用C#。

3 个答案:

答案 0 :(得分:5)

编译MYSpace时编译器不了解命名空间Source.cpp的问题。

#include <iostream>

using namespace std;

namespace MyNameSpace
{
    int PrintHello();
    extern int tempCount;
}
int main()
{
    int i;
    MyNameSpace::PrintHello();
    cout << MyNameSpace::tempCount << endl;
    cout << "Hello from main" << endl;
}

但此示例为useless。它的工作原理只是因为您只有一个消费者.cpp

您应该使用.h文件,然后在PrintFunc.h和任何其他Source.cpp中包含.cpp文件,以便使用该功能。

我会写一个例子:

Print.h

#pragma once

namespace MyNameSpace
{
    int PrintHello();
    extern int tempCount;
}

请注意,我们在此处不使用其他includesusing namespace。我们仅使用includes来使用functions interfaces中的某些类。 using namespace可以&#34;破坏&#34;消费者.cpp.h

Print.cpp

#include <iostream>
#include "Print.h"

using namespace std;

int MyNameSpace::tempCount = 111;

int MyNameSpace::PrintHello()
{
    cout << "Hello from Source1" << endl;
    return 0;
}

在这里,我们可以设置任何include,它不会触及任何其他文件。

消费者.cpp

#include <iostream>
#include "Print.h"

using namespace std;

int main()
{
    int i;
    MyNameSpace::PrintHello();
    cout << MyNameSpace::tempCount << endl;
    cout << "Hello from main" << endl;
}

VS特定:#pragma once,对于VS,您必须在#include "stdafx.h"的第一行.cpp

答案 1 :(得分:3)

使用其成员时必须提供命名空间名称。或者使用using namespace指令。

void main()
{
    int i;
    MyNameSpace::PrintHello();
    cout << MyNameSpace::tempCount << endl;
    cout << "Hello from main" << endl;
}

但是,要使其工作,名称空间应在单独的.h文件中声明,并且应包含在source.cpp

答案 2 :(得分:0)

所以最后,我已根据Dmitriy Zapevalov回答确定了问题。

First Print.h

#pragma once

namespace MyNameSpace
{
    int PrintHello();
    extern int tempCount;
}

下一个PrintFunc.cpp

#include <iostream>
#include "Print.h"

using namespace std;

namespace MyNameSpace
{
    int tempCount = 111;
    int PrintHello()
    {
        cout << "Hello from Source1" << endl;
        return 0;
    }
}

PrintFunc.cpp也可以像这样替代。

PrintFunc.cpp(替代)

#include <iostream>
#include "Print.h"

using namespace std;

int MyNameSpace::tempCount = 111;
int MyNameSpace::PrintHello()
{
    cout << "Hello from Source1" << endl;
    return 0;
}

最后是Source.cpp

#include <iostream>
#include "Print.h"

using namespace std;
using namespace MyNameSpace;

void main()
{
    PrintHello();
    cout << tempCount << endl;
    cout << "Hello from main" << endl;
}

Source.cpp也可以像这样替代。

Source.cpp(替代)

#include <iostream>
#include "Print.h"

using namespace std;

void main()
{
    MyNameSpace::PrintHello();
    cout << MyNameSpace::tempCount << endl;
    cout << "Hello from main" << endl;
}