질문 : 이 프로그램이 세 개의 C ++ 컴파일러에서 잘못 거부 된 이유는 무엇입니까?
내가 작성한 C ++ 프로그램을 컴파일하는 데 어려움이 있습니다.
이 프로그램은 매우 간단하며 내가 아는 한 C ++ 표준에 명시된 모든 규칙을 준수합니다. 확실히하기 위해 ISO / IEC 14882 : 2003 전체를 두 번 읽었습니다.
프로그램은 다음과 같습니다.
다음은 Visual C ++ 2010으로이 프로그램을 컴파일하려고 할 때받은 출력입니다.
c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172
실망해서 g ++ 4.5.2를 시도했지만 똑같이 도움이되지 않았습니다.
c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Clang (버전 3.0 트렁크 127530)은 표준 준수에 대해 높은 평가를 받기 때문에 작동해야한다고 생각했습니다. 불행히도 예쁘고 강조 표시된 오류 메시지 중 하나도 제공하지 않았습니다.
c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)
솔직히 말해서 이러한 오류 메시지가 무엇을 의미하는지 잘 모르겠습니다.
다른 많은 C ++ 프로그램에는 확장자가 .cpp 인 소스 파일이 있으므로 파일 이름을 변경해야한다고 생각했습니다. 이름을 helloworld.cpp로 변경했지만 도움이되지 않았습니다. 이름이 바뀐 프로그램을 컴파일하기 위해 Clang을 사용하려고 할 때 "84 개의 경고와 20 개의 오류가 발생했습니다."라는 메시지가 출력 되었기 때문에 Clang에 매우 심각한 버그가 있다고 생각합니다. 내 컴퓨터에서 삐 소리가 많이 났어요!
내가 여기서 뭘 잘못 했니? C ++ 표준의 중요한 부분을 놓쳤습니까? 아니면 세 컴파일러가 모두이 간단한 프로그램을 컴파일 할 수 없을 정도로 망가 졌나요?
답변
표준에서 §2.1 / 1은 다음을 지정합니다.
실제 소스 파일 문자는 필요한 경우 구현 정의 방식으로 기본 소스 문자 집합 (줄 끝 표시기의 줄 바꾸기 문자 도입)에 매핑됩니다.
컴파일러는 해당 형식을 지원하지 않으므로 (일명 기본 소스 문자 집합에 매핑 할 수 없음) 추가 처리 단계로 이동할 수 없으므로 오류가 발생합니다. 컴파일러가 이미지에서 기본 소스 문자 집합으로의 매핑을 지원하는 것은 전적으로 가능하지만 반드시 필요한 것은 아닙니다.
이 매핑은 구현에 따라 정의되므로 지원하는 파일 형식을 보려면 구현 문서를 참조해야합니다. 일반적으로 모든 주요 컴파일러 공급 업체는 (표준 적으로 정의 된) 텍스트 파일을 지원합니다. 텍스트 편집기에서 생성되는 모든 파일 (일반적으로 일련의 문자)입니다.
C ++ 표준은 C 표준 (§1.1 / 2)을 기반으로하며 C (99) 표준은 §1.2에서 다음과 같이 말합니다.
이 국제 표준은 지정하지 않습니다
— C 프로그램이 데이터 처리 시스템에서 사용하기 위해 변환되는 메커니즘
— 데이터 처리 시스템에서 사용하기 위해 C 프로그램을 호출하는 메커니즘
-입력 데이터가 C 프로그램에서 사용하기 위해 변환되는 메커니즘
다시 말하지만, 소스 파일의 처리는 컴파일러 문서에서 찾아야합니다.
출처 : https://stackoverflow.com/questions/5508110/why-is-this-program-erroneously-rejected-by-three-c-compilers
'프로그래밍 언어 > C++' 카테고리의 다른 글
C #에서 돈의 단위로 사용하기에 가장 좋은 데이터 유형 (0) | 2021.07.07 |
---|---|
C ++에서 다른 생성자 (생성자 체인)에서 생성자를 호출 하는 방법 (0) | 2021.07.07 |
32 비트 루프 카운터를 64 비트로 대체하면 Intel CPU에서 _mm_popcnt_u64의 성능 편차가 발생합니다. (0) | 2021.07.06 |
POSIX를 사용하여 C ++에서 명령을 실행하고 명령의 출력을 얻는 방법 (0) | 2021.07.06 |
new를 사용하여 C ++에서 2차원 배열을 선언하는 방법 (0) | 2021.07.06 |