본문 바로가기
언어 참조

조건부 컴파일 이해

2023. 8. 5.

이 글은 도움말을 번역한 글입니다.

조건부 컴파일이란?

조건부 컴파일을 사용하면 코드 블록을 선택적으로 실행할 수 있습니다(예: 동일한 프로그래밍 작업에 대한 다양한 접근 방식의 속도를 비교하는 디버깅 문 또는 다른 언어에 맞게 애플리케이션을 로컬라이즈하는 경우)

#Const 지시문을 사용하여 코드에서 조건부 컴파일러 상수를 선언하고 #If...Then...#Else 지시문을 사용하여 조건부로 컴파일할 코드 블록을 나타냅니다.

#Const 지시문

Visual Basic의 조건부 컴파일러 상수를 정의하는 데 사용됩니다.

조건부 컴파일러 상수

#Const 컴파일러 지시문을 사용하여 정의되거나 호스트 응용 프로그램에서 정의되고 Visual Basic 코드의 특정 블록이 컴파일되는 시기 또는 여부를 결정하기 위해 다른 컴파일러 지시문에서 사용되는 Visual Basic 식별자입니다.

Syntax
#Const constname = expression

constname : 필수 : Variant(문자열). 상수의 이름, 표준 변수 명명 규칙을 따릅니다.
expression :
필수 : 리터럴, 기타 조건부 컴파일러 상수 또는 Is를 제외한 산술 또는 논리 연산자 일부 또는 전부를 포함하는 조합입니다.

컴파일러 상수

Visual Basic for Applications는 #If...Then...#Else 지시문과 단독으로 사용할 상수를 정의합니다. 이러한 상수는 전역 범위라는 점을 제외하면 #If...Then...#Else 지시문으로 정의된 상수와 기능적으로 동일합니다. 즉, 프로젝트의 모든 곳에 적용됩니다.

Note

Win32는 32비트 및 64비트 개발 플랫폼 모두에서 True를 반환하므로 #If...Then...#Else 지시문 내의 순서가 코드에서 원하는 결과를 반환하는 것이 중요합니다. 예를 들어 Win32가 64비트에서 True를 반환하기 때문에(Win32는 Win64 환경에서 호환됨) Win64 이전에 Win32를 확인하면 Win32가 True를 반환하기 때문에 Win64 조건이 실행되지 않습니다. 다음 순서는 예측 가능한 결과를 반환합니다(이는 Winx 및 VBAx 상수 모두에 적용됨)

#If Win64 Then 
' Win64=true, Win32=true, Win16= false 
#ElseIf Win32 Then 
' Win32=true, Win16=false 
#Else 
' Win16=true 
#End If

16비트 개발 플랫폼에서 컴파일러 상수는 다음과 같이 정의됩니다.

32비트 개발 플랫폼에서 컴파일러 상수는 다음과 같이 정의됩니다.

64비트 개발 플랫폼에서 컴파일러 상수는 다음과 같이 정의됩니다.

Note

이러한 상수는 Visual Basic에서 제공되므로 어떤 수준에서도 동일한 이름으로 자체 상수를 정의할 수 없습니다.

비고

조건부 컴파일러 상수는 항상 해당 상수가 표시되는 모듈에 대해 비공개입니다. #Const 지시문을 사용하여 공용 컴파일러 상수를 생성할 수 없습니다. 공용 컴파일러 상수는 사용자 인터페이스에서만 생성할 수 있습니다.

표현식에는 조건부 컴파일러 상수와 리터럴만 사용할 수 있습니다. Const로 정의된 표준 상수를 사용하거나 정의되지 않은 상수를 사용하면 오류가 발생합니다. 반대로 #Const 키워드를 사용하여 정의된 상수는 조건부 컴파일에만 사용할 수 있습니다.

조건부 컴파일러 상수는 코드 내 위치에 관계없이 항상 모듈 수준에서 평가됩니다.

이 예제에서는 #Const 지시문을 사용하여 #If...#Else...#End If 구문에서 사용할 조건부 컴파일러 상수를 선언합니다.

#Const DebugVersion = 1 ' Will evaluate true in #If block.

다음 예제에서는 변수 값을 기반으로 디버그 코드 또는 프로덕션 코드를 실행합니다.

' Declare public compilation constant in Declarations section. 
#Const conDebug = 1 
 
Sub SelectiveExecution() 
 #If conDebug = 1 Then 
 . ' Run code with debugging statements. 
 . 
 . 
 #Else 
 . ' Run normal code. 
 . 
 . 
 #End If 
End Sub

#If...Then...#Else 지시문

선택한 Visual Basic 코드 블록을 조건부로 컴파일합니다.

Syntax
#If expression Then
statements
[ #ElseIf expression-n Then
[ elseifstatements ]]
[ #Else
[ elsestatements ]]
#End If

expression : 필수입니다. 하나 이상의 조건부 컴파일러 상수, 리터럴 및 연산자로만 구성되며 True 또는 False로 평가되는 모든 표현식입니다.
statements : 필수입니다. 연결된 표현식이 True인 경우 평가되는 Visual Basic 프로그램 줄 또는 컴파일러 지시문.
expression-n : 선택적입니다. 하나 이상의 조건부 컴파일러 상수, 리터럴 및 연산자로만 구성된 표현식으로, True 또는 False로 평가되는 모든 표현식.
elseifstatements : 선택적입니다. 표현식-n이 True인 경우 평가되는 하나 이상의 프로그램 줄 또는 컴파일러 지시문.
elsestatements : 선택적입니다. 이전 표현식 또는 표현식-n이 True가 아닌 경우 평가되는 하나 이상의 프로그램 줄 또는 컴파일러 지시문.

비고

#If...Then...#Else 지시문의 동작은 #If, #Else, #의 한 줄 형식이 없다는 점을 제외하면 If...Then...Else 문과 동일합니다. ElseIf 및 #End If 지시문; 즉, 지시문과 같은 줄에 다른 코드가 나타날 수 없습니다.

#If DEBUG_MODE Then Debug.Print "Debug mode is enabled." #Else MsgBox "Debug mode is disabled." #End If


조건부 컴파일은 일반적으로 다른 플랫폼에 대해 동일한 프로그램을 컴파일하는 데 사용됩니다. 또한 디버깅 코드가 실행 파일에 나타나지 않도록 방지하는 데 사용됩니다. 조건부 컴파일에서 제외된 코드는 최종 실행 파일에서 완전히 생략되므로 크기나 성능에 영향을 미치지 않습니다.

평가 결과에 관계없이 모든 표현식이 평가됩니다. 따라서 표현식에 사용되는 모든 상수는 정의되어야 합니다. 정의되지 않은 모든 상수는 비어 있음으로 평가됩니다.

Note

Option Compare 문은 #If 및 #ElseIf 문의 식에 영향을 주지 않습니다. 조건부 컴파일러 지시문의 표현식은 항상 Option Compare Text로 평가됩니다.

이 예제는 #If...Then...#Else 구문에서 조건부 컴파일러 상수를 참조하여 특정 문장을 컴파일할지 여부를 결정합니다.

' If Mac evaluates as true, do the statements following the #If. 
#If Mac Then 
 '. Place exclusively Mac statements here. 
 '. 
 '. 
' Otherwise, if it is a 32-bit Windows program, do this: 
#ElseIf Win32 Then 
 '. Place exclusively 32-bit Windows statements here. 
 '. 
 '. 
' Otherwise, if it is neither, do this: 
#Else 
 '. Place other platform statements here. 
 '. 
 '. 
#End If

도움말 출처

Understanding conditional compilation (VBA)

Office VBA reference topic

learn.microsoft.com

'언어 참조' 카테고리의 다른 글

다른 응용 프로그램 간의 작업  (0) 2023.08.06
재귀 프로시저 만들기  (0) 2023.08.06
With 문  (0) 2023.08.05
Do...Loop 문  (0) 2023.08.05
For Each...Next 문  (0) 2023.08.04