2011-02-24 6 views
2

수업 시간에 저는이 작업을 성공적으로 완료했지만 아주 간단한 프로그램에서만했습니다. 오늘날, 나는 더 복잡한 프로그램을 가지고 있었고, DEBUG를 상징으로 정의한 후에 이클립스는 끔찍한 일을 저질렀다. 정의를 삭제 한 후에도 이런 끔찍한 일은 사라지지 않았다. 다른 소스에서 DEBUG 심볼이 gcc 컴파일러에서 사용 중이며 직접 정의함으로써 표준 라이브러리를 방해한다고 들었습니다.C에서 상수 기호로 DEBUG를 성공적으로 사용할 수 있습니까?

직접 #define 디버그를 사용해도 되나요? 안 그래요?

답변

5

예, 직접 DEBUG 기호를 정의하는 것이 좋습니다. 하지만 이 아닌 심볼을 정의하는 것이 좋습니다. 밑줄과 대문자로 시작하는 기호 또는 밑줄 두 개는 구현 (즉, 컴파일러와 툴체인)에 사용하기 위해 예약되어 있습니다. 예약되어 있기 때문에 직접 정의해서는 안되지만 확실하게 테스트 할 수 있습니다. C99 표준의 §7.1.3을 참조하십시오. 주의해야 할

또 다른 기호는 정의하기 또는 정의하지 무료 NDEBUG,하지만 당신은 <assert.h>의 포함하기 전에 정의 할 경우, 모든 assert 문이 제거됩니다.

+0

구현 관련 항목을 찾기 위해 사용할 수있는 검색이나 키워드를 알려주시겠습니까? 나는 이클립스가 사용하는 기호를 잠시 동안 알아 내려고 노력했지만 내 Google-fu는 올바른 단어를 찾지 못하는 것 같습니다. –

0

가능성이 있지만 알아 내려는 시도를 그만 두어도 괜찮습니다.

+0

음, 알았습니다. 왜? –

+0

코드가 파손 되었다면 그 이유는 분명합니다. DEBUG가 표준 라이브러리 나 컴파일러에서 사용되는 곳을 묻는다면 그것은 다른 질문입니다. – jmilloy

+0

'DEBUG'라는 단어가 너무 일반적이어서 네임 스페이스의 어느 지점에서 다른 헤더/api와 충돌하는 것으로 거의 보장됩니다. – jmq

0

"최신"언어가 namespaces 인 이유입니다. 그것을 사용하지 마십시오. 우리 코드에서는 _DEBUG 대신에 _DEBUG_ 또는 __DEBUG__을 사용할 수 있습니다. 어떤 사람들은 앞에 밑줄을 사용하는 것을 좋아하지 않습니다.

편집 : _DEBUG을 사용하는 것으로 착각되었습니다 (사용하지 않았습니다). __DEBUG__ (앞뒤에 두 개의 밑줄 표시)을 사용합니다.

+2

이름을 두 개의 밑줄로 시작하면 안됩니다. –

+0

방금 ​​코드를 살펴 보았고 앞뒤에 이중 밑줄을 사용했습니다 (앞면에 단일 없음). – jmq

+0

밑줄과 대문자로 시작하는 이름 또는 밑줄 두 개는 구현에서 사용하도록 예약되어 있습니다. 프로그램이 예약 된 식별자를 정의하면 동작은 정의되지 않습니다 (C99 §7.1.3). –

1

DEBUG은 그런 종류의 일에 사용하기 위해 약간 일반적입니다. 왜냐하면 지구상에있는 막대한 수백만 개의 코드 원숭이도 똑같은 아이디어를 가지기 때문입니다.

PAX_DEBUG 또는 YOURCOMPANYNAME_BTREEMODULE_DEBUG 또는 비슷한 것을 사용하면 충돌 할 가능성이없는 것을 사용하는 것이 좋습니다.

2

기호를 제거해도 문제가 해결되지 않으면 기호가 문제를 일으키지 않았습니다.

나는 DEBUG을 기호로 들어 본 적이 없지만 _DEBUGused by Visual Studio입니다. 제쳐두고, 은 NDEBUG을 사용하여 어설 션문을 끕니다.

관련 문제