編譯器內部是如何處理 C 語言 typedef 關鍵字的?

時間 2021-05-31 16:34:59

1樓:甄爍華

你知道貝塞斯達嗎?就是做輻射系列和上古卷軸的那個遊戲公司。他裡面專門有乙個招的職位就是C工程師。

之前還嘗試過STM8標準下的C語言開發(英文直翻不知道這樣稱呼是否準確),做乙個能自動包裝的機器。這個project現在還在做。做下來的感覺就是在操控硬體…

顯示全部

2樓:阿爾伯特

編譯器內部是如何處理這個結構體定義:就是在問編譯期間建立符號表的過程咯?typedef只是宣告,不是定義,有些實現暫時不填它索引的錶號,當結構出現後再填入…

typedef定義在struct實際定義之前,為什麼沒有編譯錯誤呢?:c給的福利,編譯器都要實現可以提前宣告…

為什麼不直接寫成如下定義呢:如果結構體內要定義當前型別的指標時,這就能看出便利了…

3樓:冒泡

建議看c標準中關於define和declaration一節

typedef是宣告不是定義,只是告訴編譯器:以後看到這個名字就用這個型別啊。。。

比如,typedef map m,編譯器看到這裡是不會例項化這個模板的,只是記錄下名字對應關係,假如你這行和m實際起作用的位置的位元組對齊設定有區別,以後者為準(這是乙個坑,可能碰到的哦)

4樓:不中

第三個問題回答一下,主要是存在結構體某元素可能使用該結構體指標的情況(這種情況常見於鍊錶中。),此時,你再試試定義就明白了。指向本型別的指標,其型別你是用struct common_s 還是用common_t呢?

你後面的那個宣告,在最後完成前common_t還沒宣告呢,不能用。而用struct common_s的話,將乙個common_t型結構體物件的指標賦值給它時就會有型別不匹配的warnning。

5樓:劉dl

編譯器內部是如何處理這個結構體定義的呢?

typedef定義在struct實際定義之前,為什麼沒有編譯錯誤呢?

為什麼不直接寫成如下定義呢:

大二的乙個暑期project是寫的C語言子集的乙個簡易直譯器。

使用的技術是,利用GNU的flex和bison,生成中間的語法樹結構,然後自己解析語義,執行。

其中使用bison的關鍵是,要屬於C語言的BNF正規化描述文件(見編譯原理類的書),當初還沒開始學編譯原理(大三才開始學),各種尾遞迴看的各種頭疼,還見過很多從來沒用過的語法結構(你在C語言的教材裡也看不到的,不常用的等)。。。

言歸正傳,Negin中的那種先寫宣告再定義的方式貌似對應C grammer裡的「半結構定義」 的grammer。具體可查詢

ANSI C grammar 最新的 Lex 和 Yacc 描述

ANSI C grammar (Yacc)

---------ANSI C grammer 部分

declaration_specifiers

: storage_class_specifier

|storage_class_specifier declaration_specifiers

| type_specifier

|type_specifierdeclaration_specifiers

| type_qualifier

| type_qualifier declaration_specifiers

| function_specifier

| function_specifier declaration_specifiers

storage_class_specifier

:TYPEDEF

| EXTERN

| STATIC

| AUTO

| REGISTER

;type_specifier

: VOID

| CHAR

| SHORT

| INT

| LONG

| FLOAT

| DOUBLE

| SIGNED

| UNSIGNED

| BOOL

| COMPLEX

| IMAGINARY

|struct_or_union_specifier

| enum_specifier

| TYPE_NAME

;---struct的定義有如下三種方式

struct_or_union_specifier

: struct_or_union IDENTIFIER ''

| struct_or_union ''

|struct_or_union IDENTIFIER

;struct_or_union

: STRUCT

| UNION

;對於問題2,符合grammer的話,就沒有錯。

對於問題1,如何處理的問題,編譯器具體實現不知道,我能想到的也就是先register出現的struct名,等到掃瞄到定義的地方再加上定義了。

對於問題3,個人習慣問題吧。

6樓:

2. typedef定義在struct實際定義之前,為什麼沒有編譯錯誤呢?

typedef就是宣告了乙個型別的別名,不需要型別是完整的

編譯器如何處理 printf 這種語言自帶的函式?

豆芽 語言其實是個規範。如果要讓使用某個語言開發的程式要跑起來,除了編譯器,還得有工程技術支援,和語言擴充套件 庫 工程技術,比如程式執行時支援 程序載入技術 os介面對接等等 從題主的描述來講,我懷疑題主書都沒看就上來問問題。首先,printf不是語言自帶的函式。然後在parser之後的過程中,在...

設計類Python編譯器時如何處理tab和space縮排?

Belleve ptl 裡面的做法是這樣,維護乙個 stack,然後對每乙個可能作為語句分隔符的行首 如果行首的空白序列和棧頂相同,判定為相同的縮排塊 如果棧頂記錄的縮排序列是行首空白序列的真字首,則判定為縮排,當前行首空白壓棧 否則,嘗試退棧並和新的棧頂比對,若退到某一級棧頂和當前行空白相同了,則...

如何為VS2017配置C語言的編譯器?

vs2019 Visual Studio 2019 權威指南 C語言 軟體工程開發的方向 技巧要領 嗶哩嗶哩 乾杯 bilibili 不跟隨 你是想說用gcc編譯沒問題,用vs編譯出問題了吧,這是因為Windows和linux兩套編譯器對c標準支援的不一樣,你想要vs的編輯器想用gcc編譯,可以考慮...