• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

#define의 효력이 미치는 범위와 관련해서 질문 있습니다.

21.01.03 18:42 작성 조회수 398

3

#define LIKE_APPLE

#include "different_source.h"

이 순서대로 코드를 작성하니 "Apple"이 출력되었습니다.

그러면 강의에서 "Orange"가 출력된 것은 LIKE_APPLE의 정의가 헤더파일을 포함시키는 부분 뒤에 있기 때문이 아닌가요?

이 경우에는 LIKE_APPLE의 정의가 그 아래에 포함된 헤더파일에 영향을 미친다고 할 수 있지 않나요?

(윈도우, mingw64, vs code 사용중입니다)

답변 1

답변을 작성해보세요.

3

안소님의 프로필

안소

2021.01.03

안녕하세요.

#define이나 #include나 둘 다 전처리기이기 때문에 선언하는 순서에 따라 영향을 미치는 것 같습니다.

질문자님께서 말씀하신 것처럼 #define LIKE_APPLE 전처리를 #include "diffrent_source.h" 전처리보다 먼저 해주면, #define LIKE_APPLE 는 #include "diffrent_source.h"에도 영향을 미친다고 볼 수 있습니다. 빌드시 인클루딩하기로 한 헤더파일의 전체 코드 내용이 내 코드로 복사되는식으로 작동하기 때문에 main.cpp의 #include "diffrent_source.h" 이 자리에 "diffrent_source.h"의 모든 코드 내용들이 복사되는 식으로 작동이 됩니다. 따라서 이 자리에 doSomething() 의 정의가 들어오겠습니다. 그러면 doSomething() 의 정의보다  #define LIKE_APPLE 전처리문이 더 위에 있으므로 doSomething() 의 정의부분은 #define LIKE_APPLE의 영향을 받게되기 때문에 "Apple"이 출력되게 됩니다.

강의에 소개된 코드대로 #define LIKE_APPLE 전처리를 #include "diffrent_source.h" 전처리보다 나중에 해주면 "diffrent_source.h"로부터 #include "diffrent_source.h" 전처리문 위치에 복사된 doSomething() 의 정의 부분이  #define LIKE_APPLE 전처리보다 먼저 오게 되므로(즉, #define LIKE_APPLE 보다 위에 오게 되므로) doSomething() 의 정의 부분은 #define LIKE_APPLE의 영향을 받지 않게 됩니다. 

결론적으로 #define 문의 위쪽에 위치한 코드들에는 영향을 주지 않습니다. 질문자님 말씀 맞습니다!

보편적으로 #include 전처리문들을 가장 위에써주고 #define 전처리문을 #include 전처리문보다 밑에 써주는 식으로 보통 이런 순서로 코딩을 하니까 거기에 맞춰서 교수님께서 전처리기 정의는 같은 파일 안에서만 적용된다고 말씀하신 것 같아요!