1. 程式人生 > >程式比程式設計師更理解c語言! cdecl程式(分析c語言的宣告

程式比程式設計師更理解c語言! cdecl程式(分析c語言的宣告

c語言的宣告有時侯是很複雜的;比如int (*a[5])(int); 再比如:int*((*p)(int))(int);你能說明白它們的意思嗎?

像這樣的宣告很容易把一般的程式設計師弄蒙逼的。

cdecl是一個分析這種宣告的程式,輸入宣告形式,用英語輸出其描述。

我們也可以自己編寫分析程式。編寫一個這樣的分析程式,很有助於幫助我們理解c語言的宣告。

下面是照著《c專家程式設計》敲的cdecl程式。

/*
 * =====================================================================================
 *
 *       Filename:  cdecl.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2012年02月28日 21時54分11秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  MaZheng (blog.csdn.net/mazheng1989), 
[email protected]
* Company: Dalian University Of Technology * * ===================================================================================== */ #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #define MAXTOKENS 100 /* */ #define MAXTOKENLEN 64 /* */ enum type_tag{ IDENTIFIER,QUALIFIER,TYPE}; struct token{ char type; char string[MAXTOKENLEN]; }; int top =-1; struct token stack[MAXTOKENS]; struct token this; #define pop stack[top--] /* */ #define push(s) stack[++top]=s /* */ enum type_tag classify_string(void )/*推斷識別符號的型別*/ { char *s=this.string; if(!strcmp(s,"const")) { strcpy(s,"read-only"); return QUALIFIER; } if(!strcmp(s,"volatile")) return QUALIFIER; if(!strcmp(s,"void")) return TYPE; if(!strcmp(s,"char")) return TYPE; if(!strcmp(s,"signed")) return TYPE; if(!strcmp(s,"unsigned")) return TYPE; if(!strcmp(s,"short")) return TYPE; if(!strcmp(s,"int")) return TYPE; if(!strcmp(s,"long")) return TYPE; if(!strcmp(s,"float")) return TYPE; if(!strcmp(s,"double")) return TYPE; if(!strcmp(s,"struct")) return TYPE; if(!strcmp(s,"union")) return TYPE; if(!strcmp(s,"enum")) return TYPE; return IDENTIFIER; } void gettoken(void)/*讀取下一個標記到 this*/ { char *p=this.string; /*略過空白字元*/ while((*p=getchar())==' '); if(isalnum(*p)) { /*讀入的識別符號以A—Z,0-9開頭*/ while(isalnum(*++p=getchar())); ungetc(*p,stdin); *p='\0'; this.type=classify_string(); return; } if(*p=='*') { strcpy(this.string,"pointer to"); this.type='*'; return ; } this.string[1]='\0'; this.type=*p; return ; } void read_to_first_identifier() { gettoken(); while(this.type!=IDENTIFIER) { push(this); gettoken(); } printf("%s is ",this.string); gettoken(); } void deal_with_arrays() { while(this.type=='[') { printf("array "); gettoken();/*數字或']'*/ if(isdigit(this.string[0])) { int temp; sscanf(this.string,"%d",&temp); printf("0..%d ",temp-1); gettoken();/*讀取']'*/ } gettoken();/*讀取']'之後的再一個標記*/ printf("of "); } } void deal_with_function_args(){ /*處理函式引數*/ while(this.type!=')') { gettoken(); } gettoken(); printf("function returning "); } void deal_with_pointers(){ while(stack[top].type=='*') { printf("%s ",pop.string); } } void deal_with_declarator() { /*處理識別符號之後可能存在的陣列/函式*/ switch(this.type) { case '[': deal_with_arrays(); break; case '(': deal_with_function_args(); break; } deal_with_pointers(); /*處理在讀入到識別符號之前壓入到堆疊的符號*/ while(top>=0) { if(stack[top].type=='('){ pop; gettoken();/*讀取')'之後的符號*/ deal_with_declarator(); } else { printf("%s ",pop.string); } } } int main() { /*將標記呀入堆疊中,直到遇見識別符號*/ read_to_first_identifier(); deal_with_declarator(); printf("\n"); return 0; }
編譯:gcc cdecl.c -o cdecl

輸入: int *((*p)(int))(int)
輸出:p is pointer to function returning function returning pointer to int


相關推薦

程式程式設計師理解c語言 cdecl程式分析c語言宣告

c語言的宣告有時侯是很複雜的;比如int (*a[5])(int); 再比如:int*((*p)(int))(int);你能說明白它們的意思嗎? 像這樣的宣告很容易把一般的程式設計師弄蒙逼的。 cdecl是一個分析這種宣告的程式,輸入宣告形式,用英語輸出其描述。 我們也可

邏輯式程式語言極簡實現使用C#) - 1. 邏輯式程式語言介紹

相信很多朋友對於邏輯式程式語言,都有一種最熟悉的陌生人的感覺。一方面,平時在書籍、在資訊網站,偶爾能看到一些吹噓邏輯式程式設計的話語。但另一方面,也沒見過周圍有人真正用到它(除了SQL)。 遙記當時看《The Reasoned Schemer》(一本講邏輯式程式語言的小人書),被最後兩頁的直譯器實現驚豔到了

邏輯式程式語言極簡實現使用C#) - 2. 一道邏輯題:誰是凶手

本系列前面的文章: * [邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹](https://www.cnblogs.com/skabyy/p/13199800.html) 這是一道Prolog經典的練習題,中文翻譯版來自阮一峰的文章[《Prolog 語言入門教程》](https://ww

邏輯式程式語言極簡實現使用C#) - 4. 程式碼實現完結)

本文是本系列的完結篇。本系列前面的文章: * [邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹](https://www.cnblogs.com/skabyy/p/13199800.html) * [邏輯式程式語言極簡實現(使用C#) - 2. 一道邏輯題:誰是凶手](https://ww

c++:資料型別和運算子c語言的不同)

c++的標頭檔案與c語言的不同:c++增加的資料型別:結構體的區別:強制型別轉換:c語言需要括號+轉換型別來轉換;c++不需要括號,直接型別(引數),類似於函式的引數傳遞;動態分配記憶體空間:p3=ne

程式使用selectComponent獲取自定義元件時,返回null分析和解決方法)

一、原因:        元件所在的佈局層級不同,該元件被建立的時間會有所不同,意味著ready(元件生命週期函式,元件佈局完成後執行)被呼叫的時間有所不同。由於元件建立完成的時間晚於頁面建立完成,即元件生命週期函式的ready被執行的時間晚於頁面生命週期

C++寫的一個簡單的語法分析器分析C語言

本程式實現一個分析C語言的詞法分析+語法分析。 注意: 1.文法簡略,沒有實現的部分,可以在此文法的基礎上進行擴充,本程式的採用自頂向下的LL(1)文法。 2.可以自動實現求First 集和 Follow 集。 3.處終結符外(有些硬編碼的成分),終結符的文法可以

開源一個雪花演算法好用的ID生成演算法雪花漂移)

# 比雪花演算法更好用的ID生成演算法(單機或分散式唯一ID) ##

Python與C之間的相互呼叫Python C API及Python ctypes庫)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

資料庫-DML資料操作語言)和DQL資料查詢語言

MySQL的儲存引擎 什麼是儲存引擎? 關係資料庫表是用於儲存和組織資訊的資料結構,可以將表理解為由行和列組成的表格,類似於Excel的電子表格的形式。有的表簡單,有的表複雜,有的表根本不用來儲存任何長期的資料,有的表讀取時非常快,但是插入資料時很差;而我們在實際開發過程

支援 C++11/14/17 功能現代 C++)

若要了解有關 Visual Studio 2017 RC 的最新文件,請參閱 Visual Studio 2017 RC 文件。 本文描述了 Visual C++ 中的 C++11/14/17 功能。 本文內容 Visual C++ 實現了 C+

支援 C++11/14/17 功能現代 C++

支援 C++11/14/17 功能(現代 C++)   若要了解有關 Visual Studio 2017 RC

為什麼C++C要麻煩?程式設計師這樣回答,終於知道他為什麼單身了

聽過一個笑話,程式設計師們互相聊天,程式設計師A問到:為什麼C++比C麻煩那麼多?” 程式設計師B回答道:“有了物件能不麻煩麼。” 同樣衍生出來的還有一個小故事:情人節,有人看到C一個人喝酒,便問:你的好哥們C++、Java、Python他們呢? C說:都過情人節去了

C語言/C++程式設計打造表白程式——教你做一個浪漫的程式設計師

Microsoft Foundation Classes Graphics Device Interface Application Programming Interface MFC 是微軟公司的基礎類庫,封裝了大量的Windows API函式,能夠快速的開發一些桌面應

學PHPPython有前途?程式設計師漲薪最快的語言

後端開發是當今最受歡迎的技能之一。 幾乎所有新業務/初創公司都需要一個網站和一個移動應用程式 - 兩者都連線到後端的伺服器。 因此,後端開發人員對市場的需求很高,公司願意向可以很好地管理後端的開發人員投入大量資金。   許多用於後端開發的程式語言正在市場中出現: Pyth

學習C語言的教材、如何成為一名優秀的C程式設計師、激發程式設計師創意的6本書、國外程式設計師推薦:每個程式設計師都應讀的書

學習C語言的教材 我的C語言是自學的,這些年看過不少教材。 下面,我對其中一些教材做個點評。 1. How to Think Like a Computer Scientist: C version 這是我讀過最易懂的C語言教材。 雖然它只講

【黑馬程式設計師】Objective-C語言學習筆記之類二)

--------------------------------------------IOS期待與您交流!-------------------------------------------- 一、OC中類的組成 OC中類一般由宣告和實現組成。 類的宣告:儲存在.h檔案

C語言——關機小程式

C語言實現簡單的關機小程式,立即關機和定時關機 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<windows.h> int main() { p

C語言有趣小程式

問題:  烏龜想要環遊旅行,剛開始第一秒走了1米,隨著體力和毅力的減退第二秒走了二分之一米,第三秒走了三分之一米…問:什麼時候走10米,一小時能走多少米。 #include<stdio.h> int main() { int t; double s,S; for(t

C語言編寫Copy程式Linux環境下的操作)

COPY程式的編寫 (作者:Baron_wu 禁止轉載) 一、實驗描述 在這個實驗中,我們要做一個程式,這個程式是將一個檔案的內容複製到一個目標檔案。首先這個程式提示使用者輸入要複製的原始檔案的名字,以及要複製到的目標檔案的名字。 確保包括必要的錯誤檢查,包括確保原始檔案存在