2016-06-08 80 views
1

我在C++的第一步中苦苦挣扎。已经问过this的问题,但没有得到有关名称空间的完整答案。在Visual C++中使用不同文件和不同名称空间中的函数

我做了以下事情。

  1. 在Visual Studio 2015年创建时的空项目(New Project - > VISUAL C++ - >空项目)
  2. 然后我Source.cpp和PrintFunc.cpp其相应的内容如下添加两个文件。

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++中理解命名空间概念。我也有很好的C#。

+1

你从全局命名空间调用它们。试试'MyNameSpace :: PrintHello();''或者你可以使用命名空间MyNameSpace来编写''但是那么即使命名空间在第一位也没用...... – DeiDei

回答

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当你想使用funtions。

我会写一个例子:

Print.h

#pragma once 

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

请注意,我们dont't使用额外的includesusing namespace这里。我们将仅使用includes来使用functionsinterfaces中的某些类。 using namespace可能“破坏”消费者的.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

+0

嗨德米特里,你的解决方案正在工作。只要给我一些时间,我会作出决定,将其标记为答案。 – VivekDev

+0

不要着急。只要记住关键字'extern'总是应该在'.h'中。 –

3

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

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

然而,为它工作的命名空间,应在单独.h文件中声明,它应该包含在你的source.cpp

+1

不起作用:“严重性\t代码\t描述\t项目\t文件\t线\t抑制状态 错误\t C2653 \t '了myNameSpace':不是类或命名空间名称\t CPPConsoleApp \t cppconsoleapp.cpp “ –

+0

是的,我已经更新了答案。 – Ari0nhh

+0

它不工作,请用完整的代码更新吗? – VivekDev

0

所以终于来了第一线。这是我已经解决了基于Dmitriy Zapevalov答案。

首先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; 
} 
相关问题