Develope

[개발] 전처리기와 코드 스니펫 with Visual Studio

nowkoes 2024. 7. 8. 00:00

전처리기와 코드 스니펫

개요

출처: https://learn.microsoft.com/ko-kr/visualstudio/ide/code-snippets-schema-reference?view=vs-2022&source=recommendations

 

 개발을 진행하다 보면, 디버깅 모드에서만 실행되어야 하는 코드가 존재한다. 즉, 릴리즈 빌드와 디버그 빌드에서 코드의 동작을 다르게 해주어야 할 필요가 있다. 이를 위해 전처리기 지시어 #ifdef와 #endif를 자주 사용한다. 이러한 전처리기 지시어는 다음과 같은 이유로 사용된다.

 

  1. 디버깅 목적: 디버깅 모드에서는 오류 메시지, 검사, 또는 추가 로깅을 수행하여 코드의 동작을 추적하고 문제를 해결할 수 있다. 이러한 디버깅 코드는 최종 사용자에게 제공되는 릴리즈 빌드에서는 불필요하거나 부적절할 수 있다.
  2. 성능 최적화: 디버깅을 위한 추가 로그나 검사는 성능에 영향을 줄 수 있다. 예를 들어, 로그 출력은 성능을 저하시킬 수 있으며, 복잡한 검사나 디버깅 코드는 실행 속도를 느리게 만들 수 있다. 릴리즈 빌드에서는 이러한 코드를 제외함으로써 최적의 성능을 유지할 수 있다.
  3. 코드 크기 감소: 디버그 코드가 많은 경우, 전체 프로그램의 크기를 증가시킬 수 있다. 릴리즈 빌드에서는 이러한 코드를 제거함으로써 실행 파일의 크기를 줄일 수 있다. 이는 저장 공간 절약과 배포 효율성을 높이는 데 도움이 된다.
  4. 조건부 컴파일: 특정 기능이나 모듈이 디버그 빌드에서만 필요할 때 유용하다. 예를 들어, 개발 중인 실험적 기능이나 테스트 코드가 디버그 빌드에서만 포함되도록 할 수 있다. 이를 통해 릴리즈 빌드에서는 안정적인 코드만 포함되도록 관리할 수 있다.

 

 하지만 이를 하나하나 작성하는 것이 상당히 귀찮은데, 이를 해결하기 위해 사용할 수 있는 것이 코드 스니펫(Code Snippet)이다. 코드 스니펫은 자주 사용되는 코드 조각을 미리 정의해 두고, 필요할 때 간편하게 삽입할 수 있도록 도와주는 기능이다. 이는 개발자가 반복적으로 작성해야 하는 코드를 자동으로 생성해 주어, 코드 작성 속도를 높이고 오류를 줄이는 데 도움을 준다. 이번 시간에는 전처리기 지시어를 코드 스니펫으로 만드는 방법에 대해 알아보자.


본문

전처리기 지시어 #ifdef 

 전처리기는 컴파일 단계에서 컴파일러가 소스 코드를 컴파일하기 전에 수행된다. 이는 컴파일 단계에서 이루어지므로, 프로그램이 실행되기 전 코드가 변경되거나 수정된다. 예를 들어, DEBUG 환경에서는 DEBUG을 출력하고, 다른 환경에서는 NON DEBUG를 출력해야 하는 코드가 있다고 가정해 보자.

 

#include <stdio.h>

int main() 
{
    printf("DEBUG");
    printf("NON DEBUG");
    return 0;
}

 

출력

 

 만약 DEBUG 환경에서는 DEBUG를 출력하고 싶고, 다른 환경에서는 NON DEBUG를 출력하고 싶으면 다음과 같이 코드를 작성하면 된다.

 

#define DEBUG
#include <stdio.h>

int main() 
{

#ifdef DEBUG
    printf("DEBUG\n");
#else
    printf("NON DEBUG");
#endif // DEBUG

    return 0;
}

출력

 

 라이브러리를 불러오기 전에 #define DEBUG를 통해 현재 환경을 상수로 정의해 주면 이런 식으로 구분하여 동작을 시킬 수 있다. 자세한 동작은 다음과 같이 이루어진다. 

 

  1. 매크로 정의 처리: #define DEBUG 매크로가 정의된다.
  2. 파일 포함 처리: stdio.h 파일의 내용을 현재 파일에 포함시킨다.
  3. 조건부 컴파일 처리: #ifdef DEBUG에 따라 #else 부분의 코드를 지운다.

 

 즉, 해당 과정을 거치고 나면 실제로 컴파일러가 처리하는 코드는 다음과 같다.

 

#include <stdio.h>

int main() 
{
    printf("DEBUG\n");

    return 0;
}

 


코드 스니펫

 하지만 이를 위해 지시어를 매번 쓰는 건 상당히 번거롭다. 이럴 때 쓰는 것이 개요에서 언급한 코드 스니펫이다.

 

C:\Users\우리집\Documents\Visual Studio 2022\Code Snippets\My Code Snippets

 

 먼저 코드 스니펫을 저장할 폴더를 하나 만들자. 필자의 경우 다음과 같은 경로에 저장해 놨으니, 참고하면 좋을 것 같다.

 

<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>WrapWithDebugElse</Title>
      <Shortcut>wdebugelse</Shortcut>
      <Description>Wrap selected text with #ifdef DEBUG, #else, and #endif</Description>
      <Author>YourName</Author>
      <SnippetTypes>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Code Language="cpp">
        <![CDATA[
#ifdef DEBUG
$selected$
#else

#endif // DEBUG
        ]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

 

 그리고 해당 폴더에서 원하는 스니펫의 이름을 지정하고 .snippet 확장자로 지정하자. 해당 문법에 대한 내용은 여기를 참고하고, 이번 게시글에서는 선택된 텍스트를 #ifdef #else #endif로 묶는 기능을 구현할 것이니 위의 텍스트를 복사하면 된다. 

 

 

 visual studio에서 ctrl + k / ctrl + b를 눌러 코드 스니펫 관리자를 열거나 도구 →  코드 조각 관리자를 열어 다음과 같이 코드 스니펫을 추가해 놓은 폴더를 추가해 주자.

 

 

 마지막으로 감싸고 싶은 줄을 드래그한 후, ctrl + k / ctrl + s 단축키를 누르면 다음과 같이 코드 감싸기가 실행된다. 안타깝게 visual studio의 내장 기능으로는 두 줄 이상의 텍스트를 선택하여 각각을 조건부 컴파일러 지시문으로 감싸는 작업을 하긴 힘들다. 이를 구현하려면 Visual Commander와 같은 툴을 사용해야 하는데, 이는 다음 시간에 알아보도록 하자.


요약

전처리기 지시어
1. 정의: 컴파일 전의 코드의 특정 부분을 처리하거나 수정하는 명령어
2. 특징
 a. 조건부 컴파일: 코드의 특정 부분을 컴파일할지 여부를 결정
 b. 매크로 정의 및 확장: 코드 내 반복적으로 사용되는 구문을 매크로로 정의하고 확장할 수 있음
 c. 파일 포함 및 코드 변환
3. 동작 단계
 - 소스 코드를 읽고, 지시어에 따라 코드의 일부를 포함하거나 제외시킴

코드 스니펫 
1. 정의: 자주 사용되는 코드 조각을 미리 정의해 두고, 필요할 때 간편하게 삽입할 수 있도록 도와주는 기능
2. 사용법
 a. 코드 스니펫 작성
 b. ctrl + k / ctrl + b를 눌러 코드 스니펫이 포함된 폴더 지정
 c. ctrl + k / ctrl + s를 눌러 코드 스니펫 적용
반응형

'Develope' 카테고리의 다른 글

[개발] 배포 파일 만들기 with Visual Studio 2015  (0) 2024.07.11