세 개의 C ++ 컴파일러가이 프로그램을 잘못 거부 한 이유는 무엇입니까?


468

내가 작성한 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로 변경 했지만 도움이되지 않았습니다. 이름을 바꾼 프로그램을 컴파일하기 위해이 프로그램을 사용하려고 할 때 "84 경고와 20 오류가 발생했습니다."라고 Clang에 매우 심각한 버그가 있다고 생각합니다. 내 컴퓨터에서 신호음이 많이 울 렸습니다!

내가 여기서 뭘 잘못 했니? C ++ 표준의 중요한 부분을 놓쳤습니까? 아니면이 컴파일러를 컴파일 할 수 없을 정도로 세 개의 컴파일러가 모두 너무 깨졌습니까?

답변:


173

표준에서 §2.1 / 1은 다음을 지정합니다.

실제 소스 파일 문자는 구현 정의 방식으로 필요한 경우 기본 소스 문자 세트 (행 끝 표시기의 개행 문자 소개)에 맵핑됩니다.

컴파일러는 해당 형식을 지원하지 않으므로 (일명 기본 소스 문자 세트에 맵핑 할 수 없음 ) 추가 처리 단계로 이동할 수 없으므로 오류가 발생합니다. 컴파일러가 이미지에서 기본 소스 문자 세트로의 맵핑을 지원할 수는 있지만 반드시 그럴 필요는 없습니다.

이 매핑은 구현에 따라 정의되므로 지원하는 파일 형식을 보려면 구현 설명서를 확인해야합니다. 일반적으로 모든 주요 컴파일러 공급 업체는 텍스트 파일을 지원합니다 (정규적으로 정의 된 텍스트 파일).


C ++ 표준은 C 표준 (§1.1 / 2)을 기반으로하고 C (99) 표준은 §1.2에서 말합니다.

이 국제 표준은
데이터 처리 시스템에서 사용하기 위해 C 프로그램이 변환되는 메커니즘을 지정하지 않습니다 .
-데이터 처리 시스템에서 사용하기 위해 C 프로그램을 호출하는 메커니즘.
-입력 데이터가 C 프로그램에 의해 사용되도록 변환되는 메커니즘;

따라서 소스 파일 처리는 컴파일러 설명서에서 찾아야합니다.


23
문장이 모호하다고 생각합니다. Merriam-Webster 사전은 텍스트서면 또는 인쇄물 또는 그러한 텍스트를 포함하는 저작물 의 원래 단어와 형태 라고 말합니다 . 이 소스 파일은 분명히 그 정의에 속합니다. 핵심 언어 실무 그룹에 결함 보고서를 제출해야한다고 생각하십니까?
James McNellis

15
오; 나는 모든 참조 문서를 읽는 것을 완전히 잊었다. 나는 단락이 문맥에서 벗어났다고 생각하므로 ISO / IEC 9899 : 1990 전체를 읽고 완전히 이해하면 여기에 다시 게시 할 것입니다.
James McNellis



211

당신 <>, (그리고 ), {그리고 }잘 어울리지 않는 것 같습니다; 더 잘 그려보십시오.


44
필자가 필기를 즐기면서 고마워하지는 않지만 이는 실제 문제 일 수 있으며 Visual C ++를 사용 하여 이름이 바뀐 helloworld.cpp 를 컴파일 할 때 발생하는 오류를 설명합니다 . "치명적인 오류 C1004 : 예기치 않은 끝 파일을 찾았습니다 "다시 시도하고 곧 다시 신고하겠습니다. 감사!
James McNellis

37
@James는 모든 png 최적화 기능을 해제해야합니다. 디버깅이 쉬워집니다.
wilhelmtell

5
@ 제임스 : "예기치 않은 파일의 끝"은 거의 확실하게 }문제의 원인 이라는 것을 의미합니다 . {
Carson63000

156

다음 파이썬 스크립트를 사용해 볼 수 있습니다. PILpytesser 를 설치해야합니다 .

from pytesser import *
image = Image.open('helloworld.png')  # Open image object using PIL
print image_to_string(image)     # Run tesseract.exe on image

사용하려면 다음을 수행하십시오.

python script.py > helloworld.cpp; g++ helloworld.cpp

110

Comic Sans를 글꼴로 사용하는 것을 잊었으므로 오류가 발생합니다.


73
불행히도, 이것은 내 손이 지원하는 유일한 글꼴입니다. 이 때문에 C ++로 프로그래밍 할 수 없다면 매우 슬플 것입니다. Java가이 글꼴을 지원한다고 생각하십니까?
James McNellis

8
어쨌든 만화를 그릴 생각이라면 Comic Sans가 필요하므로 손을 업그레이드하는 것을 진지하게 고려해야합니다.
sharptooth

8
C ++은 1 년 동안 서예 교육을 받아야합니다. 시간이 없다면 Visual Basic 또는 이진 기계 코드를 사용해보십시오 (0과 1을 가져와야합니다).
Frank Osterfeld

1
@Frank C ++ 0x §42.1 / 1은 "모든 문자열은 고딕이어야합니다."를 지정합니다.
Mateen Ulhaq

75

마지막 중괄호 뒤에 줄 바꿈이 표시되지 않습니다.

아시다시피 : "비어 있지 않은 소스 파일이 개행 문자로 끝나지 않으면, 동작은 정의되지 않습니다."


16
흠. 고맙게도이 우스운 규칙은 C ++ 0x에서 제거되었습니다. 즉, 어떻게 파일을 줄 바꿈으로 끝내는가? 텍스트 끝에 충분한 공간을 두었다고 생각했습니다 (소스 파일을 강조 표시하면 추가 공간이 남아 있어야합니다). 그래도 팁 주셔서 감사합니다!
James McNellis

8
충분한 공백이 없으면 시스템에서 컴파일을 시도 할 수 있습니다. 가장 왼쪽에서 컴파일을 시도 할 수 있도록 4 개의 모니터가 있습니다.
Tin Man

74

이 프로그램은 유효합니다. 오류가 없습니다.

내 생각 엔 당신은 당신의 컴퓨터에 바이러스가 있습니다. 드라이브를 다시 포맷하고 운영 체제를 다시 설치하는 것이 가장 좋습니다.

어떻게 작동하는지 또는 다시 설치하는 데 도움이 필요한 경우 알려주십시오.

나는 바이러스가 싫어.


17
예, Linux를 설치하십시오. 나는 당신의 문제에 대해 Windows를 비난합니다.
Raedwald

62

실제로 검은 색일 때는 멋지지만 마술 마커로 모니터 유리에 코드를 작성하지 않는 것이 도움이되었습니다. 화면이 너무 빨리 채워지고 나에게 깨끗한 모니터를주는 사람들이 매주 나에게 이름을 부릅니다.

내 직원 중 두 명 (저는 관리자입니다)이 손잡이가 달린 빨간 패드 컴퓨터 중 하나를 구입하려고합니다. 그들은 마커가 필요하지 않으며 화면이 가득 차면 화면을 직접 청소할 수 있지만 조심스럽게 흔들어야한다고 말했습니다. 나는 그것이 그렇게 섬세하다고 생각했습니다.

그래서 나는 똑똑한 사람들을 고용합니다.


2
관리자에게는 Wacom Cintiq이 훨씬 적합합니다. 비싸고 정말로 중요하다고 느끼게합니다. 회사의 모든 그래픽 디자이너는 상태가 훨씬 낮으므로 EGA 모니터를 사용해야합니다. 관리인은 CGA 모니터를 사용해야합니다. 프로그래머는 중고 흑백 터미널을 사용해야합니다.
Steve314

7
나는 "Life Like"모니터를 오랫동안 가지고있었습니다. 당신이 수영하는 물고기의 스크린 세이버가 진짜라고 맹세하는 것은 매우 현실적이었다. 그리고 작은 잠수부 사람은 그가 수영하고있는 것처럼 보였다. 나는 보물 상자를 바닥에서 얻으려고 노력하면서 팔을 젖게했다. 유일한 문제는 화면 보호기가 항상 켜져 있고 현실적인 버블 링 소음으로 인해 듣기가 어려워 졌다는 것입니다. 그리고 그들은 유지 보수를 위해 매일 모니터 상단에 물건을 뿌려야한다고 말했습니다. 그렇지 않으면 화면 보호기가 작동하지 않을 것입니다. 그 일이 있었는데, 이틀 후에 냄새가 정말 현실적이었습니다.
Tin Man

59

File format not recognized파일을 올바르게 포맷해야합니다. 이는 코드에 적합한 색상과 글꼴을 사용한다는 의미입니다. 이 색상은 컴파일러마다 다르므로 각 컴파일러에 대한 특정 설명서를 참조하십시오.)


14
이런 종류의 말이 맞아요 ... 96 개의 크레용 상자가 있으므로 정확한 전경색을 가지고 있다고 확신합니다. 나는 내일 색깔의 건설 용지를 집어 들고 다른 색상의 용지로 시험해 볼 것입니다.
James McNellis

3
안전을 위해 착색 연필과 유성 페인트를 사용하는 것이 좋습니다. C ++이 올바른 형식을 지정하기에는 매우 어려운 언어라는 것은 잘 알려진 사실입니다.
helloworld922

그래도 강조 표시를 사용하는 것을 잊지 마십시오.
sharptooth

6
@sharptooth-구문 강조는 IDE 기능입니다. 직접 작성해서는 안됩니다. 따라서 강조 표시와 함께 로봇 팔을 가져와야합니다.
Steve314

56

전처리기를 잊었습니다. 이 시도:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -

8
오! 전처리 기가 컴파일러에 포함되어 있다고 생각했습니다! 내 Windows 랩톱에서 작동하는 전처리기를 찾으려고합니다.
James McNellis

3
@James McNellis : 프리 프로세서는 프로그램이 아니며, 하이라이트 마커처럼 보이는 하드웨어입니다. 텍스트 위로 옮기면 전처리됩니다.
sharptooth

49

프로그램을 필기 한 다음 컴퓨터로 스캔 했습니까? 이것이 "helloworld.png"에 의해 암시됩니다. 이 경우 C ++ 표준 (최신 버전에서도)에는 광학 문자 인식이 필요하지 않으며 불행히도 현재 컴파일러에서 선택적 기능으로 포함되지 않습니다.

그래픽을 텍스트 형식으로 바꾸는 것이 좋습니다. 모든 일반 텍스트 편집기를 사용할 수 있습니다. 워드 프로세서를 사용하면 예쁜 출력물을 생성 할 수 있지만 스캔하는 동안 발생하는 것과 동일한 오류가 발생합니다.

정말 모험심이 많으면 코드를 워드 프로세서에 쓰려고 시도 할 수 있습니다. OCR-A 와 같은 글꼴을 사용하여 인쇄하십시오 . 그런 다음 출력물을 가져 와서 다시 스캔합니다. 그런 다음 타사 OCR 패키지를 통해 스캔을 실행하여 텍스트 양식을 생성 할 수 있습니다. 텍스트 형식은 많은 표준 컴파일러 중 하나를 사용하여 컴파일 할 수 있습니다.

그러나 디버깅 단계에서 발생할 수있는 막대한 비용의 용지에주의하십시오.


닭고기와 달걀 딜레마 : OCR 소프트웨어 용 C ++ 코드를 작성하고 OCR없이 컴파일 할 수 있습니까?
jweyrich

5
글쎄, 당신은 원래 OCR에 어셈블리를 사용합니다.
Kevin Lacquement

@jweyrich-먼저 asm / OCR 툴체인으로 C ++ / OCR을 부트 스트랩해야한다고 생각합니다.
Michael Burr

2
오 ASM, 그렇습니다! 펀치 카드의 ASM .
jweyrich

46

컴파일 할 수 있도록 아래 포함을 그리십시오.

#include <ChuckNorris>

구문 오류를 컴파일 할 수 있다고 들었습니다 ...


46
나는 개인적으로 선호합니다 #include <JonSkeet>.
Icode4food

40

불행히도 C ++뿐만 아니라 여러 언어를 모두 지원하는 세 개의 컴파일러를 선택했습니다. 그들은 모두 당신이 사용한 프로그래밍 언어를 추측해야합니다. 이미 알고 있듯이 PNG 형식은 C ++뿐만 아니라 모든 프로그래밍 언어에 적합합니다.

일반적으로 컴파일러는 언어 자체를 알아낼 수 있습니다. 예를 들어 PNG가 크레용으로 그려지는 경우 컴파일러는 Visual Basic이 포함되어 있음을 컴파일러가 알게됩니다. 샤프 펜슬로 그린 것처럼 보이는 경우, FORTRAN 코드를 작성하여 직장에서 엔지니어를 쉽게 식별 할 수 있습니다.

이 두 번째 단계는이 경우 컴파일러에도 도움이되지 않습니다. C와 C ++는 너무 비슷해 보입니다 #include. 따라서 컴파일러가 실제로 어떤 언어인지 결정하도록 도와야합니다. 이제 비표준 수단을 사용할 수 있습니다. 예를 들어 Visual Studio 컴파일러는 / TC 및 / TP 명령 줄 인수를 사용하거나 프로젝트 파일에서 "Compile as : C ++"옵션을 사용할 수 있습니다. GCC와 CLang은 내가 알지 못하는 자체 메커니즘을 가지고 있습니다.

따라서 표준 코드를 대신 사용하여 컴파일러에 다음 코드가 C ++임을 알리는 것이 좋습니다. 지금까지 알게 된 것처럼 C ++ 컴파일러는 그들이 받아들이는 것에 매우 까다 롭습니다. 따라서 C ++를 식별하는 표준 방법은 협박 프로그래머가 C ++ 코드에 추가하는 것입니다. 예를 들어, 다음 줄은 컴파일러에게 다음과 같은 것이 C ++임을 분명히합니다 (그리고 불만없이 컴파일하는 것이 좋습니다).

// To the compiler: I know where you are installed. No funny games, capice?

10
#pragma컴파일러에 "메시지를 얻는"올바른 방법 이라고 생각 했습니까?
Lev Bishop

33

이거 한번 해봐:

우주 왕복선에서 공룡을 보십니까?


4
나는 오타가 있다고 생각합니다-그것은 (1)이 endl아닌 end1( L) 이어야합니다 . 그러나 +1은 훌륭하게 완료되었습니다!
Rup

44
나는 이것을 3 시간 동안 쳐다보고 있지만 여전히 공룡이나 우주 왕복선을 볼 수 없습니다. :-(
oosterwal

32

컴파일러가 전문가 모드로 설정되어 있습니까?! 그렇다면 컴파일해서는 안됩니다. 현대의 컴파일러는 "Hello World!"에 질려 있습니다.


27

OCR의 말 :

N lml_e <loJ+_e__}

.lnt Mk.,n ( ln+ _rSC Lhc_yh )
h_S_
_l

s_l . co__ <, " H llo uo/_d ! '` << s l . ena_ .
TP__rn _ |
_|

공정하게 말하자면 꽤 좋았습니다.


4
와, 필기를 스캔하려고 시도한 후 OCR이 개선되었습니다 (직접 쓰는 데 몇 시간이 걸렸습니다).
James P.

40
Perl 태그를 추가해야한다고 생각합니다.
MSalters

26

helloworld.png : 파일이 인식되지 않습니다 : 파일 형식 이 인식되지 않습니다

분명히, 당신은 하드 드라이브를 포맷해야합니다.

실제로 이러한 오류는 읽기가 어렵지 않습니다.


20

프로그램을 PNG에서 ASCII로 변환했지만 아직 컴파일되지 않았습니다. 귀하의 정보를 위해 선 너비 100과 250자를 사용했지만 비슷한 결과를 얻었습니다.

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               

8
대신 80 개 또는 72 개 열을 사용해야 합니다.
Tobias Kienzler

16

첫 번째 문제는 메인 함수의 끝에서 잘못된 값을 반환하려고한다는 것입니다. C ++ 표준에 따르면 main ()의 반환 유형은 int이지만 대신 빈 세트를 반환하려고합니다.

다른 문제는 적어도 g ++에서 컴파일러가 파일 접미사에서 사용되는 언어를 추론한다는 것입니다. g ++ (1)에서 :

주어진 입력 파일에 대해 파일 이름 접미사가 수행되는 컴파일 종류를 결정합니다.

file.cc 파일 .cp 파일 .cxx 파일 .cpp 파일 .CPP 파일 .c ++ 파일 .C

전처리해야하는 C ++ 소스 코드. .cxx에서 마지막 두 글자는 모두 문자 그대로 x 여야합니다. 마찬가지로 .C는 리터럴 대문자 C를 나타냅니다.

이 문제를 해결하면 데모 에서 볼 수 있듯이 완전히 작동하는 Hello World 응용 프로그램을 사용할 수 있습니다 .


3
0이 널 세트가 아니기 때문에 0 자리를 슬래시하면 숙제 나 시험에서 누가 이륙 할 것인지 교수님이 돌아 왔습니다. 그는이 답변에 감사 할 것이다.
Michael Burr


13

귀하의 컴파일러는 기대하고 ASCII를 하지만 프로그램이되어 분명히 사용하여 작성 EBCDIC을 .


마지막으로 C ++에서 프로그램을 ASCII, UTF-8 또는 다른 형식으로 작성해야한다고 지정하지 않았다고 들었습니다.
Adrian Ratnapala

8

이미지를 컴파일하려고합니다.

main.cpp라는 문서에 직접 작성한 내용을 입력하고 컴파일러를 통해 해당 파일을 실행 한 다음 출력 파일을 실행하십시오.


23
PC에서 날짜를 확인하십시오.
James P.

14
하하. 그러나 나는 내가 대답 할 수있는 쉬운 것을 마침내 찾았다!
코디 그레이

10
이것은 바보입니다. 우리 모두는 컴파일러가 공백을 최적화하여 크게 압축 된 공백 만 남겨두고 이진 1로 압축하여 오류로 반환한다는 것을 알고 있습니다. 코드는 0으로 컴파일되고 오류를 반환하지 않는 화이트 아웃을 사용하여 작성해야했습니다.
Tin Man

7

최종 닫는 중괄호 바로 앞에 출력의 정밀도 앞에 콜론을 지정해야합니다 . 출력이 숫자가 아니기 때문에 정밀도는 0이므로 다음이 필요합니다.

: 0}


5

추가 :

using namespace std;

포함 직후 : P : D


5
나는 std항상 타이핑하는 것을 선호합니다 . 하나를 얻지 말라고 상기시킵니다.
Mateen Ulhaq


5

문제는 구문 정의에 있습니다.보다 고전적인 설명을 위해 눈금자와 나침반을 사용해보십시오!

건배,


5

입력 인터페이스를 전환하십시오. C ++에서는 키보드가 스캐너가 아닌 컴퓨터에 연결되어 있어야합니다. 여기에 주변 장치 충돌 문제가있을 수 있습니다. 키보드 입력 인터페이스가 필수인지 ISO 표준에서 확인하지 않았지만, 내가 사용한 모든 컴파일러에 해당됩니다. 그러나 이제 C99에서 스캐너 입력을 사용할 수 있으며이 경우 프로그램이 실제로 작동해야합니다. 그렇지 않은 경우 다음 표준 릴리스 및 컴파일러 업그레이드를 기다려야합니다.


5

당신은 대괄호에 다른 색상을 시도 할 수 있습니다, 아마도 녹색 또는 빨간색이 도움이 될 것입니까? 컴파일러가 검정 잉크를 인식 할 수 없다고 생각합니다. : P


5

'반환'과 세미콜론 사이의 문자를 인식 할 수없는 유일한 사람입니까? 그럴 수 있습니다!


4
이것은 "diameter"라고 부르는 특수 라인이있는 대문자 O입니다. 컴파일러는 Midpoint Circle Algorithm을 사용하도록 분명하게 지시합니다. 눈을 확인해야한다고 생각합니다.
Mateen Ulhaq
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.