2011-08-18 3 views
4

일부 코드를 이해하려고하는데 이전에 본 적이없는 키워드를 발견했습니다. 나는 그것을 시도했지만 그것에 관해서는 아무것도 발견하지 못했다.#line의 C 키워드

char *valtext; 
#line 1 "Values.l" 
#define INITIAL 0 
#line 2 "Values.l" 
int reserve(char *s); 
#line 388 "lex.val.c" 

누군가가이 코드 조각을 이해하는 데 도움이되기를 기대하면서 전체 블록을 포함 시켰습니다. 내 시스템에서 "Values.l"이라는 파일을 찾을 수 없으며이 코드는 "lex.val.c"파일에 있습니다.

미리 감사드립니다.

+0

이 그것을 설명하는 것 같다 http://msdn.microsoft.com/en-us/library/34dk387t(v=vs.80).aspx을 (당신이 C에 대해 요구하고 실현 C#이 아니기 때문에 결국 적용될 수 있습니다.) – sellmeadog

+0

http://msdn.microsoft.com/en-US/library/b5w2czay%28v=VS.80%29.aspx –

+0

예, "googling"line isn 매우 유용 할 것 같지 않아? –

답변

4

#line 지시자는 처리기의 사용이다. 컴파일러의 오류 메시지가 사용자가 이해할 수있는 행 번호를 제대로 참조하도록합니다.

예를 들어, mycode.c의 12 행은 전 처리기를 거쳐 mycode.tmp.cc의 183 행에있을 수 있습니다. C 컴파일러가 해당 행에서 오류를 발견하면 오류는 mycode.tmp.cc의 183 행에 있음을 알리고 싶지 않습니다. 따라서 C 컴파일러는 각 행의 "원래 좌표"를 제공해야합니다. #line 지시문은 오류 메시지에 사용할 현재 줄 번호와 파일 이름을 컴파일러에 알리기 위해이 작업을 수행합니다.

0

그 코드는 전처리기를 거쳤으며 동일한 컴파일러의 다른 단계에서 소비되도록 의도 된 컴파일러의 한 단계에서 마크 업되었습니다. 이 기능이 사용하는 용도로는 사용되지 않습니다.

참조하는 파일은 컴파일러에서 실행되는 임시 파일 일 수 있습니다.

+1

일반적으로'# line' 지시어로 참조되는 파일은 원본 파일입니다. 요점은 * 임시 파일을 참조하지 않도록하는 것입니다. 그리고 다른 입력 파일에서 (임시) C 소스를 생성하는 도구를 가지고 있다면'# line'을 직접 사용하는 것이 합리적입니다. lex/flex와 yacc/bison이 이것을합니다. 그러나 더 많은 목적을 위해, 당신은 그것을 무시할 수 있습니다. –

+0

방금 ​​"Values.l"이 없다고 말했어. 'Values.l'은 분명히'lex'를 실행하여 생성 된 파일입니다 - 실제로 이것은'lex.yy.c' 파일입니다. –

0

이렇게하면 the line number changes이됩니다.

이것은 오류 메시지 및 경고와 같이 Lex 입력 파일의 줄 번호를 표시하기 위해 수행됩니다. Lex는 C 코드를 생성하기 때문에 #line 지시어는 오류를 컴파일하지 않고 경고는 아무런 가치가 없습니다.

9

#line 지시어는 현재 파일 이름과 줄 번호에 대한 컴파일러의 설정을 지정합니다. 이는 __FILE____LINE__ 기호, 실패한 assert()에 의해 생성 된 출력 및 진단 메시지 (오류 및 경고)에 영향을줍니다. 일반적으로 전 처리기에서 사용되므로 오류 및 경고 메시지는 전 처리기의 출력이 아니라 원래의 소스 코드를 참조 할 수 있습니다 (일반적으로 메시지가 표시 될 때까지 버려집니다).

또한 lex/flex 및 yacc/bison과 같은 C 소스 코드를 생성하는 다른 도구에서 사용되므로 오류 메시지가 (임시) 생성 된 C 코드가 아닌 입력 파일을 참조 할 수 있습니다.

확실한 참조는 the C standard (pdf), 섹션 6.10.4입니다.

형태

#line number 

의 라인은 현재 행 번호를 설정한다. 형식의 행

#line number "file-name" 

줄 번호와 파일 이름을 모두 설정합니다.매크로 확장을 통해이 두 형식 중 하나를 생성 할 수도 있습니다. 예를 들면 :

#define LINE 42 
#define FILE "foo.c" 
#line LINE FILE