2013-08-29 3 views
0

누구나 STRAY 정의를 정의 할 수 있습니까? . 두 번째 질문 : 나는 책을 읽으면서 "21 일 동안 C++을 가르쳐 라."그는 DEBUG라는 용어를 정의해서는 안된다고 말했다. 왜 그런지 알고 싶습니까? 질문의C++ 전 처리기 정의

+6

아마도 책을 읽어야합니다. – progrenhard

+1

내가 아는 한 'DEBUG'에는 아무런 문제가 없습니다. 하지만 밑줄로 시작하는 식별자를 사용하지 않으려 고합니다. 여러 가지 방법으로 구현에 사용하도록 예약되어 있으므로 발가락을 밟을 수도 있습니다. –

+0

확인. 고맙습니다. 나는 그것을 가지고있다 – ProDev7

답변

7

첫 번째 부분 :

잃은 정의이 가장 가능성이 의도적되지 않습니다 일부 다른 코드 (또는 실제 코드)의 동작을 변경하는 처리기 정의입니다. 예를 들어, 헤더 파일을 작성하고 다음 줄을 사용할 수 있습니다

#define main is_awesome 

이것은 아마도 심지어 코드에서, 헤더 파일에 직접적인 영향을주지 않습니다,하지만 다른 사람이이 헤더 파일을 포함 이 빗나가는 정의은 해당 함수의 이름을 int is_awesome(int argc, char **argv)으로 바꿀 것이고 갑자기 응용 프로그램에 대한 main 엔트리 포인트가 없기 때문에 int main(int argc, char **argv) 함수를 포함하는 파일이 문제가 될 것입니다!

마찬가지로 매크로 DEBUG은 이러한 문제를 일으킬 수 있습니다. 일반적으로 DEBUG은 디버그 코드 작성 여부에 따라 컴파일러 자체에서 정의해야합니다 (컴파일러에 따라 직접 설정해야 할 수도 있음). 자신의 어딘가에서 DEBUG을 정의한다면 실제로 릴리스 빌드를 작성하더라도 디버그 코드를 트리거 할 수 있습니다.

일반적으로 이러한 버그 나 문제는 추적하기가 어려울 수 있습니다. 특히 전처리 된 코드를 보는 방법을 모르는 경우 (기본 코드에서 문제/오류를 볼 수없고 보고 될 가능성이 가장 높은 행 번호도 해제됩니다).


어떻게 피하려면? 당신의 삶과 훨씬 쉽게 다른 사람의 것을 만들 것 세 가지 간단한 규칙 :

  • 당신이 정말로 (컴파일시 코드 포함을 제어하기 위해, 예를 들어)에있을 경우에만 처리기 정의를 사용합니다.
  • 헤더 파일 외부에서 필요하지 않은 항상 사전 처리기 정의를 정리하십시오 (#undef).
  • 일부 전역 전 처리기 정의를 사용해야하는 경우 이름을 고유하게 지정하십시오 (예 : 라이브러리 나 프로젝트 이름 앞에 붙이면됩니다. 예 : DEBUG을 정의하는 대신 MYLIB_DEBUG을 사용할 수 있습니다.
+0

ok 천재. 나는 네 thourough- 유용한 설명을 주셔서 감사합니다. – ProDev7