當前位置:首頁 » 編程軟體 » ll編譯器

ll編譯器

發布時間: 2022-12-07 19:05:42

1. LLVM - 工具

LLVM工具通過調用LLVM的一部分庫,實現庫的功能,通常使用編譯器或者開發編譯器的人會用到這些工具。

這是一個在LLVM IR級別做程序優化的工具,輸入和輸出都是LLVM IR。編譯器,或者基於LLVM做優化的開發者通常會使用這一標准工具來查看優化的效果。它也提供了很多option, 可以執行某一特定的pass。

這是微觀意義上的LLVM編譯器,不同於gcc的編譯器,它的輸入是LLVM IR,輸出是匯編文件或者是目標文件。通過-filetype=asm或者-filetype=obj來指定輸出是匯編文件還是目標文件,若生成是目標文件,llc會調用LLVM中的匯編輸出的代碼庫來工作(注意這個匯編器和gcc的匯編器也不同,它輸入的是MI,是一種後端的中間表示)。除此之外,還可以用-On來指定優化級別(llc默認優化級別是-O2),或者其他一些參數。

(.bc文件換成.ll文件也可以)

這是LLVM匯編器,它輸入匯編文件,輸出目標文件, 類似於gnu中的as命令。同時,它也可以反匯編,指定特殊參數(–disassemble)就行。可以發現,llc和llvm-mc都會調用到輸出目標文件的庫,也就是MCObjectStreamer。

這個工具是LLVM IR的解釋器,也是一個JIT編譯器。LLVM可以把c語言翻譯成LLVM IR,然後解釋執行,與Java的那一套類似,這也是最初LLVM編寫時的實現(一個虛擬機運行IR)。

最早看到這個工具,以為是鏈接器,其實它是IR級別的鏈接器,鏈接的是IR文件。談到這里,可以說一下LLVM針對多個源文件編譯時的兩種目標碼輸出方式。

第一種是LLVM先通過前端把每個源文件單獨翻譯成IR級別,然後用llvm-link鏈接成一個IR,然後再經過優化、後端等步驟生成目標文件,使用llvm-link的同時,可以使用鏈接時優化。不過需要注意,這種方式同樣需要最終調用鏈接器,將這個目標文件鏈接成可執行文件。

第二種是LLVM通過前端把每個源文件單獨翻譯後,再單獨經過優化、後端等工作,將每個源文件生成目標文件,之後再調用鏈接器,將所有目標文件鏈接成可執行文件。

這是針對LLVM IR的匯編器,其實名字里帶as,實際上不是gcc那個as,它的功能是將.ll文件翻譯為.bc文件,LLVM項目里,.ll稱為LLVM匯編碼,所以llvm-as也就是IR的匯編器了。

與llvm-as剛好相反,IR的反匯編器,用來將.bc文件翻譯為.ll文件。

最後也提一下clang,它也是現在LLVM項目中一個很重要的前端工具。clang能夠調用整個編譯器的流程,也就是上邊其他工具調用的庫,它很多都同樣會調用。clang通過指定-emit-llvm參數,可以配合-S或-c生成.ll或.bc文件,這樣我們就能把Clang的部分和LLVM的後端分離開來獨立運行,對於觀察編譯器流程來說,很實用。

還有一些其他工具,就不舉例了,可以查看LLVM項目路徑下/src/tools/中查看。

2. LLVM每日談之一 LLVM是什麼

寫在前面的話: 最近接觸llvm比較多,在這個上面花了不少的時間。感覺llvm要完全理解透是個很不容易的事情,需要在學習過程中好好的整理下自己的思路。剛好又閱讀了開源項目Storm的作者Nathan Marz的博客《You should blog even if you have no readers》,就打開自己的blog,開始了這個llvm每日談的系列。希望自己能堅持的久一點,多寫寫llvm的每個方面,多寫寫自己的理解。 llvm是low level virtual machine的簡稱,其實是一個編譯器框架。llvm隨著這個項目的不斷的發展,已經無法完全的代表這個項目了,只是這種叫法一直延續下來。 llvm是一個開源的項目。它最早的時候是Illinois的一個研究項目,主要負責人是Chris Lattner,他現在就職於Apple. Apple 目前也是llvm項目的主要贊助者之一。 llvm的主要作用是它可以作為多種語言的後端,它可以提供可編程語言無關的優化和針對很多種CPU的代碼生成功能。此外llvm目前已經不僅僅是個編程框架,它目前還包含了很多的子項目,比如最具盛名的clang. llvm的優點是開源,有一個表達形式很好的IR語言,模塊化作的特別好。 llvm這個框架目前已經有基於這個框架的大量的工具可以使用。 llvm的官方網站地址是:llvm.org。在這里可以下載最新的發布代碼,也可以找到介紹llvm的相關文檔。 附錄:llvm目前支持的工具(描述來自網路) llvm-as 將人類可讀的 .ll 文件匯編成位元組代碼 llvm-dis 將位元組代碼文件反編成人類可讀的 .ll 文件 opt 在一個位元組代碼文件上運行一系列的 LLVM 到 LLVM 的優化 llc 為一個位元組代碼文件生成本機器代碼 lli 直接運行使用 JIT 編譯器或者解釋器編譯成位元組代碼的程序 llvm-link 將幾個位元組代碼文件連接成一個 llvm-ar 打包位元組代碼文件 llvm-ranlib 為 llvm-ar 打包的文件創建索引 llvm-nm 在 位元組代碼文件中列印名字和符號類型 llvm-prof 將 'llvmprof.out' raw 數據格式化成人類可讀的報告 llvm-ld 帶有可裝載的運行時優化支持的通用目標連接器 llvm-config 列印出配置時 LLVM 編譯選項、庫、等等 llvmc 一個通用的可定製的編譯器驅動 llvm-diff 比較兩個模塊的結構 bugpoint 自動案例測試減速器 llvm-extract 從 LLVM 位元組代碼文件中解壓出一個函數 llvm-bcanalyzer 位元組代碼分析器 (分析二進制編碼本身,而不是它代表的程序) FileCheck 靈活的文件驗證器,廣泛的被測試工具利用 tblgen 目標描述閱讀器和生成器 lit LLVM 集成測試器,用於運行測試

3. c++語言問題,常數+LL是什麼用法

在c++中數字是有後綴的(整型不帶後綴默認為int型),用來表示該數是什麼類型
舉個例子
long long a=100000000000;
如果直接這樣將100000000000賦值給a,你可以試試看,結果輸出a時發現是其他的一個數。
原因剛才已經講到,100000000000沒有後綴編譯器將之默認作為int型存儲,而int型顯然無法存下100000000000這么大的數字,因此會溢出而變成其他的數,之後才賦值給a。
但如果這樣寫:
long long a=100000000000ll //或者100000000000LL,大小寫沒有關系。
那麼編譯器就知道100000000000是一個64位整型,並按64位整型存儲,因此不會溢出,數值就保持正常,賦給a也就沒有問題。

上面貌似有點離題,不過能夠說明後綴的作用。
樓主可以自行去網路一下,可以找到更詳盡的解釋。

4. gcc編譯器在編譯過程會進行哪些檢查

一個編譯器,執行的時候
先會做詞法分析,其中會判斷是否符合詞法規范,一般用有限自動機寫
然後是語法分析,自頂向下的LL和自底向上的LR,會判斷是否符合文法規范
然後就是四元式,語義動作、匯編指令,後面的檢查應該就不多了

5. 請問在 c語言中 1LL的意義

C語言中的printf、scanf、 sprintf、sscanf等函數中需要用格式字元串來控制數據的輸出格式。

比如: printf("%lx", 65535); /* 將65535輸出為十六進制格式 */

輸入參數"%lx"就是格式控制串,其中的%是格式控制符, l表示數據為長整型,x表示輸出十六進制

執行該函數輸出的內容為: ffff

更詳細的格式控制符說明如下:

語法: %[-][width][.prec]type

其中中括弧中的內容是可選項,每項的含義分別如下:

-: 表示輸出時按左對齊的格式,否則為右對齊。

width:輸出的總寬度(包括後面的prec),如果給的寬度不夠,則會自動增加寬度,而不會截斷。

prec: 用於控制浮點數的輸出小數位數

type: 類型控制符,具體如下:

d或i: 有符號整數

u: 無符號整數

x: 用十六進製表示整數

o: 用八進製表示整數

f: 浮點數

g: 用科學計數法表示浮點數

s: 字元串

c: 字元

其中 d、i、u、x、f、g前面可以加上字母l或ll表示long或者long long,

比如 "%ld"可以輸出32位整數,"%lld"可以輸出64位整數。

以上內容僅供參考,因為不同的編譯器可能會根據需要定義自己的控制符。

6. 整型量的整型常量

1.八進制整常數必須以0開頭,即以0作為八進制數的前綴。數碼取值為0~7。八進制數通常是無符號數。
以下各數是合法的八進制數:
015(十進制為13)0101(十進制為65)0177777(十進制為65535)
以下各數不是合法的八進制數:
256(無前綴0)0382(包含了非八進制數碼)-0127(出現了負號)
2.十六進制整常數
十六進制整常數的前綴為0X或0x。其數碼取值為0~9,A~F或a~f。
以下各數是合法的十六進制整常數:
0X2A(十進制為42)0XA0 (十進制為160)0XFFFF (十進制為65535)
以下各數不是合法的十六進制整常數:
5A (無前綴0X)0X3H (含有非十六進制數碼)
3.十進制整常數
十進制整常數沒有前綴。其數碼為0~9。
以下各數是合法的十進制整常數:
237 -568 65535 1627
以下各數不是合法的十進制整常數:
023 (不能有前導0)23D (含有非十進制數碼)
在程序中是根據前綴來區分各種進制數的。因此在書寫常數時不要把前綴弄錯造成結果不正確。例如,數組int power_of_10[4]={0001,0010,0100,1000}的初值會被解釋為{1,8,64,1000}。
4.整型常數的後綴
在16位字長的機器上,基本整型的長度也為16位,因此表示的數的范圍也是有限定的。十進制無符號整常數的范圍為0~65535,有符號數為-32768~+32767。八進制無符號數的表示範圍為0~0177777。十六進制無符號數的表示範圍為0X0~0XFFFF或0x0~0xFFFF。如果使用的數超過了上述范圍,就必須用長整型數來表示。長整型數是用後綴「L」或「l」來表示的。例如:
十進制長整常數 158L (十進制為158) 358000L (十進制為-358000)
八進制長整常數 012L (十進制為10) 077L (十進制為63)0200000L (十進制為65536)
十六進制長整常數 0X15L (十進制為21) 0XA5L (十進制為165)0X10000L (十進制為65536)
長整數158L和基本整常數158在數值上並無區別。但對158L,因為是長整型量,C編譯系統將為它分配4個位元組存儲空間。而對158,因為是基本整型,根據計算機的內部字長和編譯器的版本分配2或4個位元組的存儲空間。因此在運算和輸出格式上要予以注意,避免出錯。對長整型都表示不了的大數,某些編譯器規定可有64位整常數表示,後綴為「LL」或「ll」。有時,因為特殊需要,可能要對短整型進行特殊標記,只有部分編譯器支持短整型的後綴「S」或「s」。無符號數也可用後綴表示,整型常數的無符號數的後綴為「U」或「u」。例如:358u,0x38Au,235Lu均為無符號數。前綴,後綴可同時使用以表示各種類型的數。如0XA5Lu表示十六進制無符號長整數A5,其十進制為165。

7. C語言的語法分析器

先做個LL(1)或者LALR的語法分析器,然後先把教材上的幾個LL(1)的例子調通過。然後網上有C語言子集的文法,有人做了轉成大小寫這樣的表述。通過那個的測試就差不多了。。。。其實做語法分析也沒多大用 編譯器的難點在於語法制導、代碼優化之類的,真要做C語言的完整編譯器,普通的學生都幾乎不可能實現。。。。就不多說了 你可以動手開始做了 如果你有較強的程序設計能力,做個漂亮的LR(1)分析器還是可以的,實在不會就做SLR(1)這樣的分析器,如果程序設計能力比較差,建議先做LL(1),那個比較好做。碼字不易,望採納!

8. C#內部編譯器錯誤

乾脆重裝系統好了

9. 支持C99編譯器

AMD x86 Open64 Compiler Suite Mostly Has C99 support equal to that of GCC.[1]
Ch Partial Supports major C99 features.[2]
Clang Mostly Does not support C99 floating-point pragmas.[3]
GCC Mostly As of January 2011[update] and GCC 4.5, 12 features suffer library issues, 1 feature is broken and 6 are missing. 43 C99 features have been completely implemented, however many features still remain unimplemented.[4]
Intel C++ compiler Mostly long double is not supported.
Open Watcom Partial Implements the most-used parts of the standard. However, they are enabled only through an undocumented command-line switch.[5]
Pelles C Mostly Supports most C99 features.
Portable C compiler Partial Working towards becoming C99-compliant.
Sun Studio Full[6]
Tiny C Compiler Mostly Does not support complex numbers or variable length arrays.[7] The developers state that "TCC is heading toward full ISOC99 compliance".[8]
IBM C for AIX, V6 [9]and XL C/C++ V11.1 for AIX [10] ?
IBM Rational logiscope Full Until Logiscope 6.3, only basic constructs of C99 were supported. C99 is officially supported in Logiscope 6.4 and later versions.[11]
Microsoft Visual Studio No As of Visual Studio 2010, there are no plans to support C99.[12][13]

看上面的支持列表,完全支持C99的只有Sun Studio和IBM Rational logiscope,
VC直到2010都沒有計劃支持C99。
補充:
在C99中包括的特性有:
對編譯器限制增加了,比如源程序每行要求至少支持到 4095 位元組,變數名函數名的要求支持到 63 位元組 (extern 要求支持到 31)
預處理增強了。例如:
宏支持取參數 #define Macro(...) __VA_ARGS__
使用宏的時候,參數如果不寫,宏里用 #,## 這樣的東西會擴展成空串。(以前會出錯的)
支持 // 行注釋(這個特性實際上在C89的很多編譯器上已經被支持了)
增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool
支持 long long, long double _Complex, float _Complex 這樣的類型
支持 <: :> <% %> %: %:%: ,等等奇怪的符號替代,D&E 里提過這個
支持了不定長的數組。數組的長度就可以用變數了。聲明類型的時候呢,就用 int a[*] 這樣的寫法。不過考慮到效率和實現,這玩意並不是一個新類型。所以就不能用在全局裡,或者 struct union 裡面,如果你用了這樣的東西,goto 語句就受限制了。
變數聲明不必放在語句塊的開頭,for 語句提倡這么寫 for(int i=0;i <100;++i) 就是說,int i 的聲明放在裡面,i 只在 for 裡面有效。(VC沒有遵守這條標准,i 在 for 外也有效)
當一個類似結構的東西需要臨時構造的時候,可以用 (type_name){xx,xx,xx} 這有點像 C++ 的構造函數
初始化結構的時候現在可以這樣寫:
struct {int a[3], b;} hehe[] = { [0].a = {1}, [1].a = 2 };
struct {int a, b, c, d;} hehe = { .a = 1, .c = 3, 4, .b = 5} // 3,4 是對 .c,.d 賦值的
字元串裡面,\u 支持 unicode 的字元
支持 16 進制的浮點數的描述
所以 printf scanf 的格式化串多支持了 ll / LL (VC6 里用的 I64) 對應新的 long long 類型。
浮點數的內部數據描述支持了新標准,這個可以用 #pragma 編譯器指定
除了已經有的 __line__ __file__ 以外,又支持了一個 __func__ 可以得到當前的函數名
對於非常數的表達式,也允許編譯器做化簡
修改了對於 / % 處理負數上的定義,比如老的標准里 -22 / 7 = -3, -22 % 7 = -1 而現在 -22 / 7 = -4, -22 % 7 = 6
取消了不寫函數返回類型默認就是 int 的規定
允許 struct 定義的最後一個數組寫做 [] 不指定其長度描述
const const int i; 將被當作 const int i; 處理
增加和修改了一些標准頭文件, 比如定義 bool 的 <stdbool.h> 定義一些標准長度的 int 的 <inttypes.h> 定義復數的 <complex.h> 定義寬字元的 <wctype.h> 有點泛型味道的數學函數 <tgmath.h> 跟浮點數有關的 <fenv.h> 。 <stdarg.h> 里多了一個 va_ 可以復制 ... 的參數。 <time.h> 里多了個 struct tmx 對 struct tm 做了擴展
輸入輸出對寬字元還有長整數等做了相應的支持
相對於c89的變化還有
1、增加restrict指針
C99中增加了公適用於指針的restrict類型修飾符,它是初始訪問指針所指對象的惟一途徑,因此只有藉助restrict指針表達式才能訪問對象。restrict指針指針主要用做函數變元,或者指向由malloc()函數所分配的內存變數。restrict數據類型不改變程序的語義。
如果某個函數定義了兩個restrict指針變元,編譯程序就假定它們指向兩個不同的對象,memcpy()函數就是restrict指針的一個典型應用示例。C89中memcpy()函數原型如下:
代碼: void *memcpy (void *s1, const void *s2, size_t size);
如果s1和s2所指向的對象重疊,其操作就是未定義的。memcpy()函數只能用於不重疊的對象。C99中memcpy()函數原型如下:代碼: void *memcpy(void *restrict s1, const void *restrict s2,size_t size);
通過使用restrict修飾s1和s2 變元,可確保它們在該原型中指向不同的對象。
2、inline(內聯)關鍵字
內聯函數除了保持結構化和函數式的定義方式外,還能使程序員寫出高效率的代碼.函數的每次調用與返回都會消耗相當大的系統資源,尤其是當函數調用發生在重復次數很多的循環語句中時.一般情況下,當發生一次函數調用時,變元需要進棧,各種寄存器內存需要保存.當函數返回時,寄存器的內容需要恢復。如果該函數在代碼內進行聯機擴展,當代碼執行時,這些保存和恢復操作旅遊活動會再發生,而且函數調用的執行速度也會大大加快。函數的聯機擴展會產生較長的代碼,所以只應該內聯對應用程序性能有顯著影響的函數以及長度較短的函數
3、新增數據類型
_Bool
值是0或1。C99中增加了用來定義bool、true以及false宏的頭文件夾 <stdbool.h> ,以便程序員能夠編寫同時兼容於C與C++的應用程序。在編寫新的應用程序時,應該使用
<stdbool.h> 頭文件中的bool宏。
_Complex and _Imaginary
C99標准中定義的復數類型如下:float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary.
<complex.h> 頭文件中定義了complex和imaginary宏,並將它們擴展為_Complex和_Imaginary,因此在編寫新的應用程序時,應該使用 <stdbool.h> 頭文件中的complex和imaginary宏。
long long int
C99標准中引進了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能夠支持的整數長度為64位。
4、對數組的增強
可變長數組
C99中,程序員聲明數組時,數組的維數可以由任一有效的整型表達式確定,包括只在運行時才能確定其值的表達式,這類數組就叫做可變長數組,但是只有局部數組才可以是變長的.
可變長數組的維數在數組生存期內是不變的,也就是說,可變長數組不是動態的.可以變化的只是數組的大小.可以使用*來定義不確定長的可變長數組。
數組聲明中的類型修飾符
在C99中,如果需要使用數組作為函數變元,可以在數組聲明的方括弧內使用static關鍵字,這相當於告訴編譯程序,變元所指向的數組將至少包含指定的元素個數。也可以在數組聲明的方括弧內使用restrict,volatile,const關鍵字,但只用於函數變元。如果使用restrict,指針是初始訪問該對象的惟一途徑。如果使用const,指針始終指向同一個數組。使用volatile沒有任何意義。
5、單行注釋
引入了單行注釋標記 "// " , 可以象C++一樣使用這種注釋了。
6、分散代碼與聲明
7、預處理程序的修改
a、變元列表
宏可以帶變元,在宏定義中用省略號(...)表示。內部預處理標識符__VA_ARGS__決定變元將在何處得到替換。例:#define MySum(...) sum(__VA_ARGS__) 語句MySum(k,m,n);
將被轉換成:sum(k, m, n); 變元還可以包含變元。例: #define compare(compf, ...) compf(__VA_ARGS__) 其中的compare(strcmp, "small ", "large "); 將替換成:strcmp( "small ", "large ");
b、_Pragma運算符
C99引入了在程序中定義編譯指令的另外一種方法:_Pragma運算符。格式如下:
_Pragma( "directive ")
其中directive是要滿打滿算的編譯指令。_Pragma運算符允許編譯指令參與宏替換。
c、內部編譯指令
STDCFP_CONTRACT ON/OFF/DEFAULT 若為ON,浮點表達式被當做基於硬體方式處理的獨立單元。默認值是定義的工具。
STDCFEVN_ACCESS ON/OFF/DEFAULT 告訴編譯程序可以訪問浮點環境。默認值是定義的工具。
STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值為ON,相當於告訴編譯程序某程序某些含有復數的公式是可靠的。默認是OFF。
d、新增的內部宏
__STDC_HOSTED__ 若操作系統存在,則為1
__STDC_VERSION__ 199991L或更高。代表C的版本
__STDC_IEC_599__ 若支持IEC 60559浮點運算,則為1
__STDC_IEC_599_COMPLEX__ 若支持IEC 60599復數運算,則為1
__STDC_ISO_10646__ 由編譯程序支持,用於說明ISO/IEC 10646標準的年和月格式:yyymmmL
9、復合賦值
C99中,復合賦值中,可以指定對象類型的數組、結構或聯合表達式。當使用復合賦值時,應在括弧內指定類型,後跟由花括弧圍起來的初始化列表;若類型為數組,則不能指定數組的大小。建成的對象是未命名的。
例: double *fp = (double[]) {1.1, 2.2, 3.3};
該語句用於建立一個指向double的指針fp,且該指針指向這個3元素數組的第一個元素。 在文件域內建立的復合賦值只在程序的整個生存期內有效。在模塊內建立的復合賦值是局部對象,在退出模塊後不再存在。
10、柔性數組結構成員
C99中,結構中的最後一個元素允許是未知大小的數組,這就叫做柔性數組成員,但結構中的柔性數組成員前面必須至少一個其他成員。柔性數組成員允許結構中包含一個大小可變的數組。sizeof返回的這種結構大小不包括柔性數組的內存。包含柔性數組成員的結構用malloc()函數進行內存的動態分配,並且分配的內存應該大於結構的大小,以適應柔性數組的預期大小。

11、指定的初始化符
C99中,該特性對經常使用稀疏數組的程序員十分有用。指定的初始化符通常有兩種用法:用於數組,以及用於結構和聯合。用於數組的格式:[index] = vol; 其中,index表示數組的下標,vol表示本數組元素的初始化值。
例如: int x[10] = {[0] = 10, [5] = 30}; 其中只有x[0]和x[5]得到了初始化.用於結構或聯合的格式如下:
member-name(成員名稱)
對結構進行指定的初始化時,允許採用簡單的方法對結構中的指定成員進行初始化。
例如: struct example{ int k, m, n; } object = {m = 10,n = 200};
其中,沒有初始化k。對結構成員進行初始化的順序沒有限制。
12、printf()和scanf()函數系列的增強
C99中printf()和scanf()函數系列引進了處理long long int和unsigned long long int數據類型的特性。long long int 類型的格式修飾符是ll。在printf()和scanf()函數中,ll適用於d, i, o, u 和x格式說明符。另外,C99還引進了hh修飾符。當使用d, i, o, u和x格式說明符時,hh用於指定char型變元。ll和hh修飾符均可以用於n說明符。
格式修飾符a和A用在printf()函數中時,結果將會輸出十六進制的浮點數。格式如下:[-]0xh, hhhhp + d 使用A格式修飾符時,x和p必須是大寫。A和a格式修飾符也可以用在scanf()函數中,用於讀取浮點數。調用printf()函數時,允許在%f說明符前加上l修飾符,即%lf,但不起作用。
13、C99新增的庫
C89中標準的頭文件
<assert.h> 定義宏assert()
<ctype.h> 字元處理
<errno.h> 錯誤報告
<float.h> 定義與實現相關的浮點值勤
<limits.h> 定義與實現相關的各種極限值
<locale.h> 支持函數setlocale()
<math.h> 數學函數庫使用的各種定義
<setjmp.h> 支持非局部跳轉
<signal.h> 定義信號值
<stdarg.h> 支持可變長度的變元列表
<stddef.h> 定義常用常數
<stdio.h> 支持文件輸入和輸出
<stdlib.h> 其他各種聲明
<string.h> 支持串函數
<time.h> 支持系統時間函數
C99新增的頭文件和庫
<complex.h> 支持復數演算法
<fenv.h> 給出對浮點狀態標記和浮點環境的其他方面的訪問
<inttypes.h> 定義標準的、可移植的整型類型集合。也支持處理最大寬度整數的函數
<iso646.h> 首先在此1995年第一次修訂時引進,用於定義對應各種運算符的宏
<stdbool.h> 支持布爾數據類型類型。定義宏bool,以便兼容於C++
<stdint.h> 定義標準的、可移植的整型類型集合。該文件包含在 <inttypes.h> 中
<tgmath.h> 定義一般類型的浮點宏
<wchar.h> 首先在1995年第一次修訂時引進,用於支持多位元組和寬位元組函數
<wctype.h> 首先在1995年第一次修訂時引進,用於支持多位元組和寬位元組分類函數
14、__func__預定義標識符
用於指出__func__所存放的函數名,類似於字元串賦值。
15、其它特性的改動
放寬的轉換限制
限制 C89標准 C99標准
數據塊的嵌套層數 15 127
條件語句的嵌套層數 8 63
內部標識符中的有效字元個數 31 63
外部標識符中的有效字元個數 6 31
結構或聯合中的成員個數 127 1023
函數調用中的參數個數 31 127

不再支持隱含式的int規則
刪除了隱含式函數聲明
對返回值的約束
C99中,非空類型函數必須使用帶返回值的return語句.
擴展的整數類型
擴展類型 含義
int16_t 整數長度為精確16位
int_least16_t 整數長度為至少16位
int_fast32_t 最穩固的整數類型,其長度為至少32位
intmax_t 最大整數類型
uintmax_t 最大無符號整數類型
對整數類型提升規則的改進
C89中,表達式中類型為char,short int或int的值可以提升為int或unsigned int類型.
C99中,每種整數類型都有一個級別.例如:long long int 的級別高於int, int的級別高於char等.在表達式中,其級別低於int或unsigned int的任何整數類型均可被替換成int或unsigned int類型.
但是各個公司對C99的支持所表現出來的興趣不同。當GCC和其它一些商業編譯器支持C99的大部分特性的時候,微軟和Borland卻似乎對此不感興趣。

10. VC的編譯器用的是LL還是LR

LR的。
JavaCC和Antlr都是基於LL的

熱點內容
我的世界怎麼擴容伺服器內存 發布:2024-05-05 17:19:54 瀏覽:47
java讀取文件字元 發布:2024-05-05 17:15:18 瀏覽:10
三星怎麼應用加密 發布:2024-05-05 17:13:18 瀏覽:151
cad字體在那個文件夾 發布:2024-05-05 17:08:20 瀏覽:330
什麼時候用編譯器 發布:2024-05-05 17:08:20 瀏覽:765
應急救援腳本 發布:2024-05-05 17:08:17 瀏覽:337
我的世界搭建無正版驗證伺服器 發布:2024-05-05 17:03:48 瀏覽:818
我的世界伺服器地址寶可夢 發布:2024-05-05 17:00:16 瀏覽:255
dede企業源碼 發布:2024-05-05 16:57:53 瀏覽:786
如何查看java版本 發布:2024-05-05 16:45:05 瀏覽:494