簡體   English   中英

C89 vs c99 GCC編譯器

[英]C89 vs c99 GCC compiler

如果我使用c89 vs c99編譯以下程序有區別嗎? 我得到相同的輸出。 兩者之間真的有區別嗎?

#include <stdio.h>

    int main ()
    {
      // Print string to screen.
      printf ("Hello World\n");
    }

gcc -o helloworld -std=c99 helloworld.c 
vs
gcc -o helloworld -std=c89 helloworld.c 
  • //評論不是C89的一部分,但在C99中可以,
  • main()脫落而不返回任何值相當於return 0; 在C99中,但在C89中卻不是這樣。 N1256 (pdf),5.1.2.2.3p1:

    如果main函數的返回類型是與int兼容的類型,則從初始調用返回main函數等效於調用exit函數,其中main函數返回的值作為其參數; 到達終止main函數的}返回值0。

因此,您的代碼在C89中具有未定義的行為,並且在C99中具有明確定義的行為。

從理論上講,應該有一個區別。 使用“//”來標記注釋不是C89的一部分,因此如果它正確地強制執行C89規則,那將產生編譯器錯誤(使用-ansi -pedantic,它可能會這樣做,但我不記得了當然)。

這給出了一般性的概念:如果程序編譯為C89,它通常也會編譯為C99,並給出完全相同的結果。 C99主要購買了C89中不存在的一些新功能,因此您可以使用(例如)C89中不允許的可變長度數組。

您可能不得不要求迂腐規則執行以查看所有差異 - C99旨在標准化現有做法,並且一些現有做法是gcc擴展,其中一些默認啟用。

在這個論壇http://www.velocityreviews.com/forums/t287495-p2-iso-c89-and-iso-c99.html我發現了這個:

摘要:99是標准化的,有新的關鍵字,新的數組內容,復數,庫函數等。 更多的編譯器是c89完成的,因為他們已經有了這么多時間來完成它們。

A)ANSI X3.159-1989。 這是1989年12月的原始1989 C標准,基本原理。 該部分的主體在第3節中描述,“C庫” - stdio,函數等在第4節中描述。

B)ISO 9899:1990。 這是最初的ISO C標准。 “ANSI”是美國國家標准協會,因此國際人群必須擁有自己的標准,擁有自己的,不同的編號系統。 他們簡單地采用了ANSI的1989年標准,刪除了基本原理,並重新編號了部分(稱之為“條款”)。 除了極少數例外,您可以添加三個,因此大多數語言在第2節“呃”,“子句” - 6和“C庫”部分中描述。

C)ISO 9899:1999。 這是新奇的“C99”標准,包括可變長度數組,靈活數組成員,“restrict”和“_Bool”等新關鍵字,“static”關鍵字的新語義,創建匿名聚合的新語法,新的復數類型,數百個新的庫函數,等等。

新的ISO標准立即被ANSI“收回”。 我沒有看到任何關於此的官方“ANSI認可”聲明,但鑒於通常的編號系統,我希望這是ANSI標准號X3.159-1999。 (編號系統非常明顯:一個標准,一旦出來,就會獲得一個數字 - 對於ANSI來說是X.或者只是一個ISO的數字 - 以及一個表示發布年份的后綴。現有標准的更新重用了數字,新的一年。)

盡管X3.159-1989和9899:1990具有不同的年份和部分編號,但它們實際上是相同的,因此“C89”和“C90”實際上指的是相同的語言。 因此你可以說“C89”或“C90”並且意味着同樣的事情,即使是那些意識到所有細微之處的人也是如此。

原始1990年ISO標准還有幾個小修訂:“規范性附錄1”和兩個“技術勘誤”(編號;給出技術勘誤1和TC2)。 兩個TC被認為是標准措辭中的毛刺的“錯誤修復”,而NA1是實際的“變化”。 在實踐中,TC並沒有真正影響用戶,而NA1增加了一大堆人們可以使用的功能,所以NA1確實更重要。 NA1於1994年問世,因此可以將“ISO 9899:1990修改為NA1”稱為“C94”。 我也看過它叫做“C95”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM