程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言聲明及typedef常見用法

C語言聲明及typedef常見用法

編輯:關於C語言

C語言聲明的優先級規則

A 聲明從它的名字開始讀取,然後按照優先級順序依次讀取

B 優先級從高到底依次是:

B.1 聲明中被括號括起來的那部分

B.2 後綴操作符:

括號()表示這是一個函數,而

方括號[]表示這是一個數組

B.3 前綴操作符:星號*表示“指向...的指針”

C 如果const和 volatile 關鍵字的後面緊跟類型說明符(int long等)它作用域類型說明符,其他情況下,const 和 volatile關鍵字作用於它左面緊鄰的指針星後。

通過上述規則分析下面C語言聲明:

char * const *(*next)();

next是一個指針,它指向一個函數,該函數返回一個另一個指針,該指針指向一個類型為char 類型的常量指針


typdef:它為一種類型引入新的名字,並沒有創建新的類型

一般情況下,typedef用於簡潔地表示指向其他東西的指針。典型的例子是signal()原型的聲明

void (*signal(int sig, void (*func)(int)))(int)

signal是一個函數,它返回一個函數指針,這個函數指針指向的函數接受一個int參數並返回void。

可通過typedef做如下改變

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);


C語言存在多種名字空間:

標簽名(label name)

標簽(tag):這個名字空間用於所有的結構、枚舉和聯合

成員名:每個結構或聯合都有自身的名字空間

其他

在同一個名字空間裡,任何名字必須具有唯一性,但在不同的名字空間裡可以存在相同的名字。由於每個結構或者聯合具有自己的名字空間,所以同一個名字可以出現在許多不同的結構內。

typdedef struct my_tag{int i;}mytype;

struct my_tag var1;

mytype var2;

這個typedef聲明引入了mytype這個名字作為"struct my_tag{int i;}"的簡寫方式。但它同時引入了結構標簽my_tag,在他前面加個關鍵字struct可以表示同樣的意思。

typedef struct fruit {int weight;}fruit; 語句1

struct veg{int weight;}veg; 語句2

它們代表的意思完全不一樣,語句1聲明了結構標簽fruit和typedef聲明的結構類型fruit;實際效果如下

struct fruit mandarin;

fruit mandarin;

語句2聲明了結構標簽veg和變量veg,只有結構標簽能夠在以後的聲明中使用,如

struct veg potato;

如果試圖使用veg cabbage這樣的聲明,將是一個錯誤。這有點類似下面的寫法:

int i;

i j;


typedef和宏文本替換之間的區別。可以把typedef看成是一種“封裝”類型----在聲明之後不能再往裡面增加別的東西。它和宏的區別體現在兩個方面

1、可以用其他類型說明符對宏類型名進行擴展,但對typedef所定義的類型名卻不能這樣做。

#define peach int

unsigned peach i; 沒問題

typedef int peach;

unsigned peach i; 語法錯誤

2、連續幾個變量的聲明中,用typedef定義的類型能夠保證聲明中所有的變量均為同一種類型,而用#define定義的類型無法保證

#define int_ptr int *

int_ptr chalk, cheese;

經過宏擴展

int *chalk, cheese;

chalk是一個指針,cheese是一個整型。

typedef int* int_ptr;

int_ptr chalk,cheese;

chalk,cheese都為整型指針


枚舉類型

enum sizes { small = 7, medium, large = 10, humungous};

缺省情況下,整型值是從零開始。如果對列表中的某個標識符進行了賦值,那麼緊接其後的那個標識符的值就比所賦的值大1,然後類推

枚舉中的成員可以當做宏一樣直接使用,相比宏定義枚舉具有一個優點:#define定義的名字一般在編譯時被丟棄,而枚舉名字則通常一直在調試器中可見,可以在調試代碼時使用它們。






  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved