編譯器推薦 - 不要再用dev c++的100個理由




為什麼這個程序被三個C++編譯器錯誤地拒絕了? (20)

編寫我編寫的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個錯誤”。 並讓我的電腦嗶嗶!

我在這裡做錯了什麼? 我錯過了C ++標準的一些關鍵部分嗎? 還是所有三個編譯器真的太破碎了,以至於無法編譯這個簡單的程序?


helloworld.png:文件無法識別:文件格式無法識別

顯然,你應該格式化你的硬盤。

真的,這些錯誤並不難看懂。


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 _ |
_|

這是非常好的,公平的。


不幸的是,您已經選擇了三種支持多種語言的編譯器,而不僅僅是C ++。 他們都必須猜測你使用的編程語言。 正如你可能已經知道的那樣,PNG格式適用於所有的編程語言,而不僅僅是C ++。

通常編譯器可以找出語言本身。 例如,如果PNG顯然是用蠟筆繪製的,編譯器就會知道它包含Visual Basic。 如果它看起來像是用自動鉛筆繪製的,那麼很容易在工作中識別工程師,編寫FORTRAN代碼。

在這種情況下,第二步對編譯器也沒有幫助。 C和C ++看起來太相似了,直到#include 。 因此,您必須幫助編譯器確定它的真實語言。 現在,你可以使用非標準手段。 例如,Visual Studio編譯器接受/ TC和/ TP命令行參數,或者可以在項目文件中使用“編譯為:C ++”選項。 GCC和CLang有他們自己的機制,我不知道。

因此,我建議使用標準方法來告訴你的編譯器,下面的代碼是用C ++編寫的。 正如你現在發現的那樣,C ++編譯器對於他們接受的東西非常挑剔。 因此,識別C ++的標準方法是由威脅程序員添加到他們的C ++代碼中。 例如,下面的代碼將向你的編譯器澄清,接下來的內容是C ++(並且他最好不加抱怨地編譯它)。

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

似乎你的編譯器不支持這樣的HMM編碼文件。 嘗試將其轉換為ASCII。


你可以試試下面的python腳本。 請注意,您需要安裝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

你忘了預處理器。 嘗試這個:

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

你的<>(){}似乎不太匹配; 嘗試繪製它們更好。


你的字體很糟糕,解析器應該如何讀取它? 參加書法課程。


問題在於語法定義,請嘗試使用標尺和圓規進行更經典的描述!

乾杯,


嘗試切換輸入界面。 C ++期望將鍵盤插入到您的計算機中,而不是掃描儀。 這裡可能有外設衝突問題。 如果鍵盤輸入接口是強制性的,我沒有檢查ISO標準,但是對於我曾經使用過的所有編譯器都是如此。 但是現在可以在C99中使用掃描儀輸入,在這種情況下,您的程序確實可以工作。 如果沒有,你將不得不等待下一個標準版本和編譯器升級。


在標準中,§2.1/ 1規定:

必要時,以實現定義的方式將物理源文件字符映射到基本源字符集(為行尾指示符引入新行字符)。

你的編譯器不支持這種格式(也就是不能將它映射到基本的源字符集 ),所以它不能移動到進一步的處理階段,因此錯誤。 您的編譯器完全可以支持從映像到基本源字符集的映射,但不是必需的。

由於此映射是實現定義的,因此您需要查看實現文檔以查看其支持的文件格式。 通常,每個主要的編譯器供應商都支持(規範定義的)文本文件:由文本編輯器生成的任何文件,通常是一系列字符。

請注意,C ++標準基於C標準(§1.1/ 2),C(99)標准在§1.2中說:

本國際標準沒有規定
- C程序轉換為數據處理系統使用的機制;
- 調用C程序供數據處理系統使用的機制;
- 輸入數據轉換為C程序使用的機制;

因此,再次,源文件的處理是您需要在編譯器文檔中找到的東西。


您忘記使用Comic Sans作為字體,這就是它錯誤的原因。


您的編譯器需要使用ASCII碼 ,但該程序顯然是使用EBCDIC編寫的。


您需要在緊接最後一個右大括號之前指定以冒號開頭的輸出的精度。 由於輸出不是數字,所以精度為零,所以你需要這個 -

:0}


我沒有將您的程序從PNG轉換為ASCII,但它尚未編譯。 為了您的信息,我確實嘗試了寬度為100和250的字符,但兩者的結果都相當。

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

我發現使用魔術記號筆在我的顯示器玻璃上寫下我的代碼是有幫助的,儘管當它非常黑時它看起來不錯。 屏幕填滿得太快,然後給我一個乾淨的顯示器的人每週給我打電話。

我的幾個員工(我是經理)正在為我購買帶有旋鈕的紅色電腦之一。 他們說我不需要標記,我可以在屏幕滿了時自己清理屏幕,但我必須小心翼翼地晃動屏幕。 我認為這很微妙。

這就是我聘請聰明人的原因。


繪製下面的包含以使其編譯:

#include <ChuckNorris>

我聽說他可以編譯語法錯誤...


補充:

using namespace std;

之後包括:P:D


試試這種方式:


這個程序是有效的 - 我可以找到沒有錯誤。

我的猜測是你的機器上有病毒。 如果您重新格式化驅動器並重新安裝操作系統,那最好。

讓我們知道如何解決問題,或者如果您需要重新安裝幫助。

我討厭病毒。





clang