“파일 끝에 줄 바꿈 없음”컴파일러 경고
일부 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'언어 중 하나 인 progrm 에서 동일한 문제가 발생했습니다. 프로그램의 끝 즉 프로그램의 마지막 줄에 main 또는 any function)에서 enter -line no를 누르십시오 . 같은 프로그램을 실행하면 오류없이 실행됩니다.
실제로 모든 컴파일러는 #include 뒤에 새로운 줄을 추가합니다. 고맙게도 – @mxcl
하지 특정 C / C ++ 있지만 C 방언은 다음 사용시 GL_ARB_shading_language_include
확장을 OS X에서 GLSL 컴파일러는 경고 하지 누락 된 줄 바꿈에 대해. 당신은 쓸 수 있도록 MyHeader.h
로 끝나는 헤더 가드 파일을 #endif // __MY_HEADER_H__
당신은 것입니다 애프터 선을 잃을 #include "MyHeader.h"
확실히.
파일이 개행으로 끝나지 않으면 C / C ++ 버전마다 동작이 다르기 때문입니다. 특히 불쾌한 것은 오래된 C ++ 버전이며 C ++ 03의 fx는 표준에 따르면 (번역 단계)는 다음과 같습니다.
비어 있지 않은 소스 파일이 개행 문자로 끝나지 않거나 바로 앞에 백 슬래시 문자가있는 개행 문자로 끝나는 경우 동작이 정의되지 않습니다.
정의되지 않은 동작은 좋지 않습니다. 표준 준수 컴파일러는 여기에서 원하는 것을 수행 할 수 있습니다 (악성적인 코드 삽입 등) – 분명 경고 이유.
C ++ 11에서는 상황이 더 좋지만 이전 버전에서는 동작이 정의되지 않은 상황을 피하는 것이 좋습니다. C ++ 03 스펙은 C99보다 나빠서 이러한 파일을 완전히 금지합니다 (동작이 정의 됨).
이 경고는 파일이 어떻게 든 잘릴 수 있음을 나타내는 데 도움이 될 수 있습니다. 컴파일러가 아마도 어쨌든 컴파일러 오류를 던질 것입니다. 특히 함수 중간에 있거나 링커 오류 일 가능성이 있지만 더 암호가 될 수 있으며 보장되지는 않습니다.
물론 개행 직후 파일이 잘 리면이 경고가 보장되지 않지만 다른 오류가 누락되어 문제에 대한 더 강력한 힌트를 줄 수있는 경우가있을 수 있습니다.
그것은 오류가 아닙니다. 경고 일뿐입니다.
편집기에서 파일을 열고 파일의 마지막 줄로 이동 한 후 Enter 키를 눌러 파일 끝에 빈 줄을 추가하십시오.
그러나 그 외에도을 #include <iostream>
대신 사용해야합니다 <iostream.h>
. 그런 다음 그 후에 넣으 using std::cout;
십시오.
참고 URL : https://stackoverflow.com/questions/72271/no-newline-at-end-of-file-compiler-warning
'Programing' 카테고리의 다른 글
Chrome에서 자동 완성을 실행하는 방법은 무엇입니까? (0) | 2020.05.19 |
---|---|
제목 속성에서 큰 따옴표를 이스케이프 처리하는 방법 (0) | 2020.05.19 |
Java java.lang.Class에 해당하는 스칼라 (0) | 2020.05.19 |
robots.txt에서 상대 사이트 맵 URL을 사용할 수 있습니까? (0) | 2020.05.19 |
경고 : API 'variant.getJavaCompile ()'은 더 이상 사용되지 않으며 'variant.getJavaCompileProvider ()'로 대체되었습니다. (0) | 2020.05.19 |