it-swarm-ko.tech

"파일 끝에 줄 바꿈 없음"컴파일러 경고

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

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

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

180
LeChuck2k

줄 바꿈이 없을 때 발생할 수있는 문제 중 일부를 생각해보십시오. 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).

210
TJ Seabrooks

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

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

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

42
James McNellis

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

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

24
Igor Semenov

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

궁금한 점에 대한 대답은 다음과 같습니다. http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .

15
Vytautas Shaltenis

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

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

6
Leigh Caldwell

#include는 해당 줄을 파일의 리터럴 내용으로 바꿉니다. 파일이 개행으로 끝나지 않으면 #include 끌어온 다음 줄과 병합됩니다.

5
moonshadow

실제로 모든 컴파일러는 #include 뒤에 새로운 줄을 추가합니다. 고맙게도 – @mxcl

특정 C/C++가 아니라 C 방언 : GL_ARB_shading_language_include 확장을 사용할 때 OS X의 glsl 컴파일러는 줄 바꿈에 대해 NOT 경고를 표시합니다 . 따라서 MyHeader.h로 끝나는 헤더 가드로 #endif // __MY_HEADER_H__ 파일을 작성할 수 있으며 will#include "MyHeader.h" 다음 줄을 잃게됩니다.

2
Jan-Philip Loos

파일이 개행으로 끝나지 않으면 C/C++ 버전마다 동작이 다르기 때문입니다. 특히 불쾌한 것은 오래된 C++ 버전이며 C++ 03의 fx는 표준에 따르면 (번역 단계)는 다음과 같습니다.

비어 있지 않은 소스 파일이 개행 문자로 끝나지 않거나 바로 앞에 백 슬래시 문자가있는 개행 문자로 끝나는 경우 동작이 정의되지 않습니다.

정의되지 않은 동작은 좋지 않습니다. 표준 준수 컴파일러는 여기에서 원하는 것을 수행 할 수 있습니다 (악성적인 코드 삽입 등) – 분명 경고 이유.

C++ 11에서는 상황이 더 좋지만 이전 버전에서는 동작이 정의되지 않은 상황을 피하는 것이 좋습니다. C++ 03 스펙은 C99보다 나빠서 이러한 파일을 완전히 금지합니다 (동작이 정의 됨).

2
skyking

나는 c-free IDE 버전 5.0, 내 progrm에서 'c ++'또는 'c'언어 중 하나와 같은 문제가 발생했습니다.) -프로그램 끝에서 즉, 프로그램의 마지막 줄 (함수 중괄호 다음에 메인 또는 임의의 함수일 수 있음), -Enter를 누르십시오-줄 번호가 1 씩 증가합니다. 오류없이.

2
divesh

이 경고는 파일이 어떻게 든 잘릴 수 있음을 나타내는 데 도움이 될 수 있습니다. 컴파일러가 어쨌든 컴파일러 오류를 던질 것입니다. 특히 함수 중간에 있거나 링커 오류 일 가능성이 높지만 더 암호가 많을 수 있으며 보장되지는 않습니다.

물론 개행 직후 파일이 잘 리면이 경고가 보장되지 않지만 다른 오류가 누락되어 문제에 대한 더 강력한 힌트를 줄 수있는 경우가있을 수 있습니다.

0
mwfearnley