“파일 끝에 줄 바꿈 없음”컴파일러 경고 이유는 무엇입니까? 파일 끝에

일부 C ++ 컴파일러에서 다음 경고가 발생하는 이유는 무엇입니까?

파일 끝에 줄 바꿈이 없습니다.

소스 / 헤더 파일 끝에 빈 줄이 있어야하는 이유는 무엇입니까?



답변

줄 바꿈이 없을 때 발생할 수있는 문제 중 일부를 생각해보십시오. ANSI 표준에 따르면 #include처음에 파일의 파일은 파일의 앞쪽에있는 그대로 파일을 삽입 #include <foo.h>하고 파일의 내용 뒤에 새 줄을 삽입하지 않습니다 . 따라서 파서 끝에 줄 바꿈이없는 파일을 포함하면 파일의 마지막 줄이 foo.h의 첫 번째 줄과 같은 줄에있는 것처럼 보입니다 foo.cpp. foo.h의 마지막 줄이 새로운 줄이없는 주석이라면? 이제 첫 줄 foo.cpp이 주석 처리됩니다. 이들은 발생할 수있는 문제 유형의 몇 가지 예일뿐입니다.


아래의 제임스의 답변에 관심있는 당사자를 지적하고 싶었습니다. 위의 대답은 여전히 ​​C에 맞지만 새로운 C ++ 표준 (C ++ 11)이 변경되어 C ++ 및 C ++ 11을 준수하는 컴파일러를 사용할 경우이 경고가 더 이상 발행되지 않도록합니다.

James의 게시물을 통해 C ++ 11 표준에서 :

비어 있지 않고 개행 문자로 끝나지 않거나 그와 같은 스 플라이 싱이 발생하기 직전에 백 슬래시 문자 바로 앞에있는 개행 문자로 끝나는 소스 파일은 추가의 새로운 것처럼 처리해야합니다. 줄 문자가 파일에 추가되었습니다 (C ++ 11 §2.2 / 1).


답변

모든 소스 파일이 이스케이프되지 않은 줄 바꿈으로 끝나야한다는 요구 사항이 C ++ 11에서 제거되었습니다. 이제 스펙은 다음과 같습니다.

비어 있지 않고 개행 문자로 끝나지 않거나 그와 같은 스 플라이 싱이 발생하기 직전에 백 슬래시 문자 바로 앞에있는 개행 문자로 끝나는 소스 파일은 추가의 새로운 것처럼 처리해야합니다. 줄 문자가 파일에 추가되었습니다 (C ++ 11 §2.2 / 1).

적합한 컴파일러는 더 이상이 경고를 발행하지 않아야합니다 (컴파일러에 언어 사양이 다른 개정 모드가있는 경우 C ++ 11 모드에서 컴파일 할 때).


답변

C ++ 03 표준 [2.1.1.2]는 다음을 선언합니다.

… 비어 있지 않은 소스 파일이 개행 문자로 끝나지 않거나 그러한 스 플라이 싱이 발생하기 전에 백 슬래시 문자 바로 앞에있는 개행 문자로 끝나는 경우 동작이 정의되지 않습니다.


답변

“순종”에 대한 대답은 “C ++ 03 표준에 따르면 개행으로 끝나지 않는 프로그램의 동작이 정의되어 있지 않기 때문”입니다 (문구 표시).

궁금한 점은 http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html 입니다.


답변

빈 줄을 나타내는 것이 아니라 마지막 줄 (내용을 포함 할 수있는)이 줄 바꿈으로 끝나는 지 여부입니다.

대부분의 텍스트 편집기는 파일의 마지막 줄 끝에 줄 바꿈을 추가하므로 마지막 줄에 줄이 없으면 파일이 잘릴 위험이 있습니다. 그러나 줄 바꿈을 원하지 않는 올바른 이유가 있으므로 오류가 아니라 경고 일뿐입니다.


답변

#include줄을 파일의 리터럴 내용으로 바꿉니다. 파일이 줄 바꿈으로 끝나지 않으면 파일 #include을 가져온 줄이 포함 된 줄이 다음 줄과 병합됩니다.


답변

나는 c-free IDE 버전 5.0을 사용하고 있는데 ‘c ++’또는 ‘c’언어 중 하나의 프로그램에서 동일한 문제가 발생했습니다. 프로그램의 끝프로그램의 마지막 줄에 main 또는 any function)에서 enter -line no를 누르십시오 . 1. 같은 프로그램을 실행하면 오류없이 실행됩니다.