개인 자료 정리 홈페이지 입니다.

Note > cppextern, namespace, scopeBy a3040, Published on Invalid Date

기초용어 : 선언, 정의, 참조


선언: 함수의 서명(signature)을 작성

void print(); //<-- 선언

정의: 구현

void print(){ //<-- 정의

std::cout <<"hello" << std::endl;

}

참조: 


extern은 **외부 선언(external linkage)**을 의미하며, 변수가 다른 파일에서 정의되었음을 알려주는 역할 


변수에서의 extern: 참조 

extern int globalVar; 변수는 다른 파일에서 정의되어 있으며, 이 파일에서는 그 변수를 참조한다는 뜻 


함수에서의 extern: 선언 

extern void myFunction(); 


함수는 extern을 생략하고도 선언할 수 있습니다.



namespace는 namespace 영역에서 extern scope를 갖음.


//ns.h
#ifndef __ns_h__
#define __ns_h__


namespace ns{
    namespace siam{
        extern int g_int;
    }
}
#endif

//ns.cc
namespace ns{
    namespace siam{
        int g_int = 10;
    }
}

//def.cc
#include <iostream>

int in_def_cpp_int = 100;

void print(){
    std::cout << in_def_cpp_int <<std::endl;
}

//main.cc
#include "ns.h"
#include <iostream>

extern int in_def_cpp_int; //외부 어딘가에 정의되어다는 참조
extern void print(); //외부 어딘가에 정의한것이 있다는 선언

extern int not_exitsts_int;

int main(){
    std::cout << ns::siam::g_int << std::endl;
    //std::cout << g_int << std::endl;  //에러
    
    std::cout << in_def_cpp_int << std::endl;


    in_def_cpp_int = 1000;
    print();
    std::cout << in_def_cpp_int << std::endl;
    std::cout << not_exitsts_int << std::endl;
    
    // std::cout << ns::siam::g_int << std::endl;
    return 0;
}

//cmake
//add_executable(nsmain ./ns/ns.h ./ns/ns.cc ./ns/def.cc ./ns/main.cc )