#if RELEASE가 C #에서 #if DEBUG와 같은 방식으로 작동합니까?


277

#if 컴파일러 지시문에서 본 모든 예제에서 "DEBUG"를 사용합니다. 디버그 모드에서 컴파일 할 때 실행하고 싶지 않은 코드를 제외하기 위해 같은 방법으로 "RELEASE"를 사용할 수 있습니까? 이 블록으로 둘러싸고 싶은 코드는 많은 양의 이메일을 전송하며 테스트 할 때 실수로 해당 코드를 전송하고 싶지 않습니다.


3
#if !DEBUG기능과 동일한 기능을 수행합니다 #if RELEASE. 또한, #if DEBUG다음 #else다음 #endif모드에서 실행하는 다른 코드가 있다면.
Nat

답변:


275

아니, 당신이 몇 가지 일을하지 않으면 그렇지 않습니다.

여기서 중요한 부분은 DEBUG가 실제로 무엇이며 컴파일러가 확인할 수있는 일종의 상수입니다.

프로젝트 속성을 확인하면 빌드 탭 아래에 세 가지가 있습니다.

  • "조건부 컴파일 기호"라는 텍스트 상자
  • "DEBUG 상수 정의"라고 표시된 확인란
  • "TRACE 상수 정의"라고 표시된 확인란

이름이 RELEASE 인 그러한 확인란이나 상수 / 기호가 미리 정의되어 있지 않습니다.

그러나 조건부 컴파일 기호라는 텍스트 상자에 해당 이름을 쉽게 추가 할 수 있지만 구성별로 설정되므로 프로젝트 구성을 릴리스 모드로 설정해야합니다.

따라서 기본적으로 텍스트 상자에 추가하지 않으면 #if RELEASE구성에서 코드가 생성되지 않습니다.


393

RELEASE 정의되어 있지 않지만 사용할 수 있습니다

#if (!DEBUG)
  ...
#endif

2
그렇지 않지만 물론 NOT 연산자를 사용할 수 있습니다. 내 대답을 쓸 때 생각하지 않았습니다.
Lasse V. Karlsen

4
IMHO는 솔루션을 사용하는 것이 더 명확하고 "정확합니다".
Daniel Schaffer

1
그냥 RELEASE 및 DEBUG보다 더 많은 구성을 가질 수있다 특히 때문에 - 내 프로젝트의 일부 DEBUG, RELEASE 및 배포하거나 DEV (DEBUG), TEST 및 PROD (릴리스)이
아담 Nofsinger

위의 의견에 혼란스러워하는 사람은 편집되지 않은 답변 RELEASE이 정의 되었는지 궁금해했습니다 .

41

아니.

디버그 구성에서는 DEBUG정의 된 상수 (Visual Studio에서 자동으로 정의 됨)가 있지만 릴리스 모드에 대해 정의 된 상수는 없습니다. 빌드중인 프로젝트 설정을 확인하십시오.

프로젝트-> 빌드 에서 [DEBUG 상수 정의]를 선택 하는 것은 모든 파일의 시작 부분에 #define DEBUG를 포함시키는 것과 같습니다.

릴리스 구성에 대한 RELEASE 상수를 정의하려면 다음으로 이동하십시오.

  • 프로젝트 속성-> 빌드
  • 릴리스 모드를 선택하십시오
  • 에서 조건부 컴파일 기호 입력 텍스트 상자 : RELEASE

1
릴리스 구성에 대한 RELEASE 상수와 테스트 구성에 대한 TESTING 상수를 정의했을 때 매우 유용합니다. 릴리스에만 https가 필요함을 정의하는 데 매우 유용#if (RELEASE) [RequireHttps] #endif
tekiegirl

27

VS 설치 (VS 2008)에서 #if RELEASE작동하지 않습니다. 그러나 당신은 단지 사용할 수 있습니다#if !DEBUG

예:

#if !DEBUG
SendTediousEmail()
#endif

10

전에는 본 적이 없지만 ...

#if (DEBUG == FALSE)

#if (!DEBUG)

나중에 작동합니까?


전 처리기 기호에는 C #에 값이 없습니다. 그것들은 단지 "정의"또는 "정의되지 않음"이다. 따라서 !두 번째 예와 같이 운영자 만 작동합니다.
Jonathon Reinhart

1
MSDN에 따르면 ==와 같은 연산자를 사용하여 true 또는 false를 테스트 할 있습니다. msdn.microsoft.com/ko-kr/library/4y6tbswk.aspx
jason_ruz


4

"팝 카탈린"이 맞았습니다. 빌드 유형을 기반으로 정의를 제어하면 많은 유연성이 제공됩니다. 예를 들어, 동일한 솔루션에서 "DEBUG", "DEMO"및 "RELEASE"구성을 모두 가질 수 있습니다. 따라서 두 가지 솔루션으로 중복 프로그래밍 할 필요가 없습니다.

따라서 RELEASE 조건부 컴파일 기호를 정의 할 때 와 동일 #if RELEASE하거나 #if (RELEASE)작동합니다 #if DEBUG.

다음은 "Pop Catalin"게시물에서 발췌 한 것입니다. 릴리스 구성에 대한 RELEASE 상수를 정의하려면 다음으로 이동하십시오. * 프로젝트 특성-> 빌드 * 릴리스 모드 선택 * 조건부 컴파일 기호 텍스트 상자에 RELEASE를 입력하십시오.


2

나는 이것이 오래된 질문이라는 것을 알고 있지만 TEST 또는 UAT와 같은 DEBUG 및 RELEASE 외부에서 자신의 구성을 만들 수 있다고 언급 할 가치가 있습니다.

그런 다음 프로젝트 속성 페이지의 빌드 탭에서 "조건부 컴파일 기호"를 테스트 (예 : TEST)로 설정하면 다음과 같은 구문을 사용할 수 있습니다.

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

필요한 경우 다른 클라이언트 또는 전체 웹 메소드와 같은 특정 이유로이 구성을 사용할 수 있습니다. 우리는 또한 과거에 일부 명령이 특정 하드웨어에서 문제를 일으킨 적이 있었기 때문에 하드웨어 X에 배포 할 때 앱을 구성했습니다.


0

조건부 컴파일 타임 기호 (원하는 이름)를 직접 만들 수 있습니다. 프로젝트 속성 상자의 메뉴 옵션에있는 "프로젝트 빌드 대화 상자"로 이동하십시오 : 프로젝트-> [프로젝트 이름] 속성 ...

"C # 코드 파일 맨 위에"정의 할 수도 있습니다. 처럼:

#define RELEASE
// or
#undef RELEASE

#if 문에서 기호를 사용할 수 있습니다.

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif

-8

왜 안돼?

#if RELEASE
#undef DEBUG
#endif

3
릴리스 모드에서는 Visual Studio에서 정의한 RELEASE라는 상수가 없습니다.
팝 카탈린

1
/d:RELEASE작동합니다. 릴리스 구성 (프로젝트 속성 빌드 탭) 아래의 조건부 컴파일 기호에이를 추가 할 수도 있습니다.
SliverNinja-MSFT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.