简体   繁体   中英

Problem with linking one file containing namespace definition with another using that namespace in C++?

I have two files once is named as test.cpp and another as ani.cpp.

test.cpp is as follows:

#include<iostream>

namespace Anirudh{

    void start(){
        std::cout<<"This is the start function of the namespace Anirudh\n";
    }
}

and the file ani.cpp is as follows

#include<iostream>

using namespace Anirudh;
int main(){

    start();
    return 0;
}

and this is what I am doing on the terminal

anirudh@anirudh-Aspire-5920:~/Desktop/testing$ g++ -c test.cpp
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ g++ test.o ani.cpp 
ani.cpp:3: error: ‘Anirudh’ is not a namespace-name
ani.cpp:3: error: expected namespace-name before ‘;’ token
ani.cpp: In function ‘int main()’:
ani.cpp:6: error: ‘start’ was not declared in this scope
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ 

This is the first time I am trying to define my own namespace in C++ and using it in another code. I got my code running after #include "test.cpp" in my ani.cpp file but I want to link the object code of test.cpp with ani.cpp rather than including it inside ani.cpp I have even tried extern namespace Anirudh; but that didn't work. Of-course there is a proper way to link them which I do not know right now. So please enlighten me. Thanks in advance.

Within ani.cpp you never told the compiler that there's a namespace Anirudh somewhere else in the program prior to doing the using . If you're used to other module systems this probably seems quirky.

What you can do is declare the namespace+function prior to calling it, with these lines before the using namespace in ani.cpp

namespace Anirudh{    
    void start();
}

Often these declarations would be wrapped up in a header but that's probably not needed for this simple example.

What about prototyping the function a la:

namespace Anirudh {
    void start();
} // namespace Anirudh

int main(...){
//...

If you don't have header file, then the least you've to do is : write the prototype of your function in ani.cpp before calling it as,

using namespace Anirudh;

void Anirudh::start();

int main(){

    start();
    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM