ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 헤더 가드
    c++ 2020. 1. 13. 18:29

    함수를 두 번 이상 정의하는 프로그램은 컴파일 에러가 발생한다

    #include<iostream>
    using namespace std;
    
    void doSomething()
    {
    	add(1, 2);
    }
    int add(int a, int b)
    {
    	return a + b;
    }
    int main()
    {
    	doSomething();
    
    	return 0;
    }

                                                                  <main.cpp>

    다음과 같은 소스 파일이 있다.

    이때 add함수와 doSomething 함수를 헤더파일로 만들어서 include해서 사용하겠다.

     

    int add(int a, int b)
    {
    	return a + b;
    }

                                                                        <add.h>

     

    #include "add.h";
    void doSomething()
    {
    	add(1, 2);
    }

                                                                  <doSomething.h>

     

    #include<iostream>
    #include "new.h";
    #include "add.h";
    using namespace std;
    
    
    int main()
    {
    	doSomething();
    
    	return 0;
    }

                                                                    <main.cpp>

     

    이렇게 헤더파일과 main소스파일을 구성하면 컴파일 에러가 난다 그 이유가 뭘까?

    main.cpp의 include를 풀어해석하면

    #include<iostream>
    //#include "new.h";
    //#include "add.h";
    using namespace std;
    
    
    int add(int a, int b)
    {
    	return a + b;
    }
    
    int add(int a, int b)
    {
    	return a + b;
    }
    void doSomething()
    {
    	add(1, 2);
    }
    int main()
    {
    	doSomething();
    
    	return 0;
    }

    다음과 같다 즉add함수가 두번 정의되어서 컴파일 에러가 발생한다 

    이런 현상을 어떻게 하면 방지할수있을까? 

     

    방법은 두가지 이다

     

    //#pragma once
    
    #ifndef doSomething//doSomething가 이미 정의되어있으면
    #define doSomething
    int add(int a, int b)//이 내용을 정의하지말라
    {
    	return a + b;
    }
    #endif // !doSomething
    
    

                                                                       <add.h>

    다음과 같이 ifndef endif를 사용하는것이다

    doSomething이 다른데서 이미 정의를 하였으면 본 내용을 정의하지 않는 방법이며 이것이 헤더 가드 방법이다.

     

    #pragma once
    
    int add(int a, int b)
    {
    	return a + b;
    }
    

                                                                       <add.h>

     

    이 방법은 헤더 파일을 만들면 저절로 #pragma once가 생성되있다

    이 또한 add가 다른곳에서 정의되었으면 본 내용을 또 정의하지 않는 방법이며 헤더 가드 방법보단 수월한 방법이다

     

    이때 add.h파일만 #pragma once를 선언하는게 아니고 <doSomething.h>에도 선언해준다.

     

    #pragma once는 헤더 가드와 같은 기능을 하며, 짧다는 게 장점이다.

    그러나 C++ 언어의 공식적인 부분이 아니므로 모든 컴파일러가 지원하는 것은 아니다. 호환성을 위해 헤더 가드를 사용하는 것이 좋다.




    'c++' 카테고리의 다른 글

    전처리기  (0) 2020.01.13
    namespace  (0) 2020.01.13
    모두의 약수  (0) 2020.01.03
    인라인함수  (0) 2019.12.29
    상속 연습문제  (0) 2019.12.28
Designed by Tistory.