2010-06-29 4 views
0

gcc 4.4.4 c89객체 매크로 정의

저는 이것을 유지하고있는 일부 코드에서 보았습니다.

#define FALSE 0 
#define TRUE 1 

그것과 같은 일부 기능에 사용되었습니다 :

#define FALSE 0 
#define TRUE (!FALSE) 

다음 서면으로 어떤 차이가 어떤 제안을

if(condition failed) { 
    return FALSE; 
} 
else { 
    return TRUE; 
} 

많은 감사,

답변

1

한 차이가 (!FALSE) 경우에, 당신은 변경하는 경우 : 그러나 TRUE 수정하지 않고

#define FALSE 0 

여전히 "작품"당신의 프로그램

#define FALSE 1 

에,을 ... 어쨌든 안전 할 것 같지 않습니다. 프로그램이 다음과 같은 구문에 의존한다고 확신하기 때문에.

if (funtion_that_returns_FALSE()) { 
} 

FALSE의 정의를 변경하면 깨질 수 있습니다. 그것을 변경하지 마십시오 :)

1

C "if"문은 0을 거짓으로 해석하고 절대적으로 다른 것으로 해석합니다. 그래서 1이 평범 할지라도 TRUE에 어떤 값을 사용하는 것이 중요하지 않습니다.

하지만 (! 0) == 1 어쨌든이 변경 사항이 없어야합니다.

>> cat joe.c 
#include <stdlib.h> 

#define FALSE 0 
#define TRUE (!FALSE) 

int main (int argc, char * argv[]) { 
    printf("false %d\ntrue %d\n", FALSE, TRUE); 
    return 0; 
} 
>> cc joe.c 
>> ./a.out 
false 0 
true 1 
>> 
+0

하지만 (!0) == 1 어쨌든 구현에 따라 달라질 수 있습니다. 하지만 당신이 정말로, 당신은하지한다고했다 경우 (bool_value == TRUE) { ... } 같은 조건을 많이하지 않는 한 문제가되지 않습니다. –

+0

! 는 C의 부울 연산자이며 지정한 인자가 0이면 1을 반환하고 그렇지 않으면 0을 반환합니다. 사람들은 때때로 생각합니다! "스왑 비트"연산자이지만, 그렇지 않습니다. 그러나 당신의 요점은 잘 만들어졌습니다. C를 쓸 때 "거짓"이 0 인 것에 의지 할 수는 있지만 특정 값을 갖는 "사실"에 의존하는 실수 인 경우 0이 아니라고 확신 할 수 있습니다. – eemz

1

편집 : 나는 질문을 거꾸로 읽었다. 죄송합니다. TRUE가! FALSE이고 FALSE가 0이면 TRUE는 1입니다.

컴파일러는 런타임에 계산할 수없는 (! 1)을 볼 것이므로 FALSE를 0으로 평가합니다.

그것은 단지 바보입니다.

+1

, 0이 아닌 것은 모두 참입니다. 바로 그 코드가 나타내는 것입니다. 어리석은 생각은하지 않습니다. 실제로는 임의로 진실한 가치를 선택하는 것보다 더 정숙 할 수도 있습니다. – Stephen

+0

@Stephen : 1은 임의의 값이 아닙니다. C에서 부울 값을 반환하면 false가 0 또는 true가 반환됩니다. 따라서 1로 TRUE를 정의하는 것은 완벽한 의미를 갖습니다. ! 0 (1)을 사용하면 사실에 대해 좀 더 분명하게 알 수 있습니다. 그러나이 기본 사실에 대해 상기하려면 설명을 필요로한다면 C 프로그래머로서 위험한 삶을 살 수 있습니다. ;) – Secure

+0

@ 안전 : 나는이 세부 사항에 따라 위험한 선을 걷고 있다는 것에 확실히 동의한다. 아마도 임의적 인 말은 내 부분에서 가난한 선택이었다. 제 관점은'if (c)'는'c'가 0으로 평가되면'else' 브랜치 만 평가한다는 것입니다. 따라서 'TRUE'가 0이 아닌 것으로 표현되는 것이 중요합니다. 예,'bool' 타입의 개발을 위해서! :) – Stephen

0

이 작업을 수행하는 가장 좋은 방법은 다음과 같습니다

는 REWRITE_PROGRAM 고급 신경 네트워크를 사용하여, 그 함수 (사전에 행 번호와 소스 파일을 제공)을 호출하는 매크로입니다
#ifndef FALSE 
#define FALSE 0 
#elif FALSE != 0 
#undef FALSE 
#define FALSE REWRITE_PROGRAM("FALSE") 
#endif 

#ifndef TRUE 
#define TRUE 1 
#elif TRUE != 1 
#undef TRUE 
#define TRUE REWRITE_PROGRAM("TRUE") 
#endif 

, 지능적으로 재 작성됩니다 TRUE 또는 FALSE의 상충하는 정의를 피할 수 있도록 TRUE가 1 이외의 것으로 정의되고 FALSE가 0이 아닌 것으로 정의됩니다. 수정 된 코드를 생성하고 빌드 한 후에는 새로 빌드 된 응용 프로그램 버전을 실행합니다 종료하십시오.

백업으로 다시 작성 AI는 가정이 올바르지 않은 경우에 REWRITE_PROGRAM 코드를 추가하여 새로운 가정이 올바른지 확인합니다.

궁극적으로 프로그램은 올바른 때까지 반복적으로 자체를 다시 작성하므로 TRUE 및 FALSE 정의 방법, 충돌 및 향후 정의가 변경 될지 걱정할 필요가 없습니다.