일부 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. 같은 프로그램을 실행하면 오류없이 실행됩니다.