2010-04-30 4 views
1

C 프로그래밍 때 새로운 내용입니다. 난 당신이 #define Const 5000 같은 것을 입력하면 컴파일러가 컴파일 타임에 Const로 모든 인스턴스를 5000으로 대체한다고 생각했습니다. 틀렸어? 내 코드에서이 작업을 시도하고 구문 오류가 발생합니다. 내가 왜 이럴 수 없어?if 문에서 #defined 값을 사용할 수 있습니까 (C 프로그램에서)?

#define STEPS_PER_REV 12345 

... in some function 
if(CurrentPosition >= STEPS_PER_REV) 
{ 
    // do some stuff here 
} 

컴파일러가 구문 오류로 if 문에 대해 불만을 제기하여 세부 정보를 제공하지 않습니다.

+2

무엇이 오류입니까? – nc3b

+0

은 같은 파일에 있습니까? – Anycorn

+0

오류 메시지는 "구문 오류 : 토큰 -> ';' ; 열 31 "그리고 그들은 같은 파일에 있습니다. 이상한 것은 CURRENT_POSITION = STEPS_PER_REV라는 할당 문에서 사용할 수 있지만 IF 문에서는 그렇지 않다는 것입니다. – PICyourBrain

답변

12

의견에있는 사람들이 옳습니다. #define의 끝에는 거의 확실하게 세미콜론이 있습니다.

(... 당신은 줄 끝에 세미콜론을 한 것으로 가정)

CURRENT_POSITION = 12345;; 

이 있지만됩니다 귀하의 경우 :이 과제가되고 있음을 의미입니다

if(CurrentPosition >= 12345;) 

코스가 잘못되었습니다.

#defines는 C 코드가 아닙니다. 세미콜론이 필요하지 않습니다.

+0

괜찮습니까? 이것이 문제였습니다! – PICyourBrain

2

코드 조각이 정확합니다. #define은 문자 그대로 문자열을 보충합니다 (좀 더 지능적입니다).

-E 옵션을 사용하여 gcc에서 전 처리기가 수행중인 작업을 확인할 수 있습니다.이 옵션은 전처리 기가 실행 된 후 코드를 출력합니다.

0

C 사전 처리기가 STEPS_PER_REV12345으로 바꿀 것이라는 점에서 맞습니다. 따라서 if 문은 제공 한 코드를 기반으로 멋지게 보입니다.

이 코드의 맨 아래로 가려면 코드와 오류 메시지의 실제 내용을 게시하십시오.

0

컴파일러가 모든 인스턴스를 매크로의 내용으로 바꾼다고 말하면 적절합니다. CurrentPosition의 유형을 확인하십시오. 오류가있을 수 있습니다.

+0

당신은 그 유형에 뭔가있을 것입니다.CurrentPosition은 부호없는 long입니다. – PICyourBrain

+0

부호없는 long으로 작동해야합니다. 난 당신이 좀 더 당신이 코드를 게시해야한다고 생각, 그렇지 않으면 오류를 찾기 간단하지 않습니다. –

0

예,하지만 그것은 const가 아니고 매크로 여야합니다. 당신은 아마 당신의 비교에서 잘못된 타입을 얻습니다.

0

#define in c는 매크로로, c 프로세서에서 발견되면이를 대체하기 위해 사용됩니다. 예를 들어, 소스 코드에서 전처리 단계 후

**#define MAX_VALUE 500** 

*if(reservations < **MAX_VALUE**)* 
{ 
    ...... 
} 

will be become into 

*if(reservations < **500**)* 
{ 
     ...... 
} 

을 입력하십시오. if 문장에서 부울 법칙에 사용될 수 있습니다.

관련 문제