中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折!

歡迎光臨中圖網 請 | 注冊
> >>
你必須知道的495個C語言問題

包郵 你必須知道的495個C語言問題

出版社:人民郵電出版社出版時間:2023-06-01
開本: 16開 頁數: 262
中 圖 價:¥68.4(7.6折) 定價  ¥89.8 登錄后可看到會員價
加入購物車 收藏
開年大促, 全場包郵
?新疆、西藏除外
本類五星書更多>

你必須知道的495個C語言問題 版權信息

你必須知道的495個C語言問題 本書特色

1.全球C語言程序員集體智慧的結晶。以問答形式解答400多個常見C語言問題,針對初始化、數組、指針、字符串等各個方面主題進行闡述,并結合豐富的代碼示例來說明關鍵點。

2.Amazon全五星好評圖書。實用性強,簡明易懂。提供涵蓋495個問題的索引,使得讀者可以更容易地查找需要的信息。

3.作者Steve Summit 15年C編程經驗的見解,以清晰易懂的方式呈現出常被忽視或誤解的微妙移植性問題、正確的語言使用和系統特定的問題。

4.內容系統,覆蓋C語言的方方面面,以實用、具體的方式講解C語言,有助于C程序員通過更好地掌握語言的要點和技巧來提高程序設計水平。

你必須知道的495個C語言問題 內容簡介

《你必須知道的495個C語言問題》以問答的形式組織內容,討論了學習或使用C語言的過程中經常遇到的一些問題。書中列出了C用戶經常問的400多個問題,涵蓋了初始化、數組、指針、字符串、內存分配、庫函數、C預處理器等各個方面的主題,并分別給出了解答,而且結合代碼示例闡明要點。 《你必須知道的495個C語言問題》結構清晰,講解透徹,是各高校相關專業C語言課程很好的教學參考書,也是各層次C程序員的實踐指南。

你必須知道的495個C語言問題 目錄

第 1章 聲明和初始化 1



基本類型 1

1.1 我該如何決定使用哪種整數類型? 1 

1.2 為什么不精 確定義標準類型的大小? 2

1.3 因為C語言沒有精 確定義類型的大小,所以我一般都用typedef定義int16和int32。然后根據實際的機器環境把它們定義為int、short、long等類型。這樣看來,所有的問題都解決了,是嗎? 2 

1.4 新的64位機上的64位類型是什么樣的? 3



指針聲明 3

1.5 這樣的聲明有什么問題?char *p1, p2; 我在使用p2的時候報錯了。 3

1.6 我想聲明一個指針,并為它分配一些空間,但卻不行。這樣的代碼有什么問題?char *p; *p=malloc(10); 4



聲明風格 4

1.7 怎樣聲明和定義全局變量和函數**好? 4

1.8 如何在C中實現不透明(抽象)數據類型? 5

1.9 如何生成“半全局變量”,就是那種只能被部分源文件中的部分函數訪問的變量? 5



存儲類型 6

1.10 同一個靜態(static)函數或變量的所有聲明都必須包含static存儲類型嗎? 6

1.11 extern在函數聲明中是什么意思? 6

1.12 關鍵字auto到底有什么用途? 7



類型定義(typedef) 7

1.13 對于用戶定義類型,typedef 和#define有什么區別? 7

1.14 我似乎不能成功定義一個鏈表。我試過typedef struct{char *item; NODEPTR next;}* NODEPTR; 但是編譯器報了錯誤信息。難道在C語言中結構不能包含指向自己的指針嗎? 7 

1.15 如何定義一對相互引用的結構? 9

1.16 Struct{ } x1;和typedef struct{ } x2; 這兩個聲明有什么區別? 10

1.17 “typedef int(*funcptr)();”是什么意思? 10



const 限定詞 10

1.18 我有這樣一組聲明:typedef char *charp; const charp p; 為什么是p而不是它指向的字符為const  10

1.19 為什么不能像下面這樣在初始式和數組維度值中使用const值?const int n=5; int a[n]; 10

1.20 const char *p、char const *p和char *const p有什么區別? 10



復雜的聲明  11

1.21 怎樣建立和理解非常復雜的聲明?例如定義一個包含N個指向返回指向字符的指針的函數的指針的數組? 11 

1.22 如何聲明返回指向同類型函數的指針的函數 我在設計一個狀態機,用函數表示每種狀態,每個函數都會返回一個指向下一個狀態的函數的指針。可我找不到任何方法來聲明這樣的函數——感覺我需要一個返回指針的函數,返回的指針指向的又是返回指針的函數……,如此往復,以到無窮。 12 



數組大小 13

1.23 能否聲明和傳入數組大小一致的局部數組,或者由其他參數指定大小的參數數組? 13

1.24 我在一個文件中定義了一個extern數組,然后在另一個文件中使用,為什么sizeof取不到數組的大小? 13



聲明問題 14

1.25 函數只定義了一次,調用了一次,但編譯器提示非法重聲明了。 14

*1.26 main的正確定義是什么?void main正確嗎? 15

1.27 我的編譯器總在報函數原型不匹配的錯誤,可我覺得沒什么問題。這是為什么? 15

1.28 文件中的第 一個聲明就報出奇怪的語法錯誤,可我看沒什么問題。這是為什么? 15

1.29 為什么我的編譯器不允許我定義大數組,如double array[256][256]  15



命名空間 15

1.30 如何判斷哪些標識符可以使用,哪些被保留了? 15



初始化 18

1.31 對于沒有顯式初始化的變量的初始值可以作怎樣的假定?如果一個全局變量初始值為“零”,它可否作為空指針或浮點零? 18 

1.32 下面的代碼為什么不能編譯 intf(){char a[]="Hello, world!";} 18

*1.33 下面的初始化有什么問題?編譯器提示“invalid initializers ”或其他信息。char *p=malloc(10); 19

1.34 char a[]= "string literal";和char *p="string literal"; 初始化有什么區別?當我向p[i] 賦值的時候,我的程序崩潰了。 19 

1.35 char a{[3]}= "abc"; 是否合法? 20

1.36 我總算弄清楚函數指針的聲明方法了,但怎樣才能初始化呢? 20

1.37 能夠初始化聯合嗎? 20



第 2章 結構、聯合和枚舉 21



結構聲明 21

2.1 struct x1{ };和typedef struct{ }x2; 有什么不同? 21

2.2 這樣的代碼為什么不對?struct x{ }; x thestruct; 22

2.3 結構可以包含指向自己的指針嗎? 22

2.4 在C語言中用什么方法實現抽象數據類型**好  22

*2.5 在C語言中是否有模擬繼承等面向對象程序設計特性的好方法? 22

2.6 為什么聲明extern f(struct x *p); 給我報了一個晦澀難懂的警告信息? 23

2.7 我遇到這樣聲明結構的代碼:struct name {int namelen; char namestr[1];};然后又使用一些內存分配技巧使namestr數組用起來好像有多個元素,namelen記錄了元素個數。它是怎樣工作的?這樣是合法的和可移植的嗎? 23 

2.8 我聽說結構可以賦給變量也可以對函數傳入和傳出。為什么K&R1卻明確說明不能這樣做? 25

2.9 為什么不能用內建的==和!=操作符比較結構?  26

2.10 結構傳遞和返回是如何實現的? 26

2.11 如何向接受結構參數的函數傳入常量值?怎樣創建無名的中間的常量結構值? 26

2.12 怎樣從/向數據文件讀/寫結構? 27



結構填充 27

2.13 為什么我的編譯器在結構中留下了空洞?這導致空間浪費而且無法與外部數據文件進行“二進制”讀寫。能否關掉填充,或者控制結構域的對齊方式? 27 

2.14 為什么sizeof返回的值大于結構大小的期望值,是不是尾部有填充? 28

2.15 如何確定域在結構中的字節偏移量? 28

2.16 怎樣在運行時用名字訪問結構中的域? 29

2.17 C語言中有和Pascal的with等價的語句嗎?  29

2.18 既然數組名可以用作數組的基地址,為什么對結構不能這樣? 29

2.19 程序運行正確,但退出時卻“core dump ”(核心轉儲)了,怎么回事? 29



聯合 30

2.20 結構和聯合有什么區別? 30

2.21 有辦法初始化聯合嗎? 30

2.22 有沒有一種自動方法來跟蹤聯合的哪個域在使用? 30



枚舉 31

2.23 枚舉和一組預處理的#define有什么不同?  31

2.24 枚舉可移植嗎? 31

2.25 有什么顯示枚舉值符號的容易方法嗎? 31



位域 31

2.26 一些結構聲明中的這些冒號和數字是什么意思? 31

2.27 為什么人們那么喜歡用顯式的掩碼和位操作而不直接聲明位域? 32



第3章 表達式  33



求值順序 33

3.1 為什么這樣的代碼不行?a[i]= i ; 33

3.2 使用我的編譯器,下面的代碼int i= 7; printf("%d\n", i * i ); 打印出49。不管按什么順序計算,難道不該是56嗎? 33 

3.3 對于代碼int i=3; i=i ; 不同編譯器給出不同的i值,有的為3,有的為4,哪個是正確的? 34 

*3.4 有這樣一個巧妙的表達式:a^= b^= a^= b; 它不需要臨時變量就可以交換a和b的值。 34

3.5 可否用顯式括號來強制執行我所需要的計算順序并控制相關的副作用?就算括號不行,操作符優先級是否能夠控制計算順序呢? 35 

3.6 可是&&和||操作符呢?我看到過類似while((c = getchar()) != EOF && c != '\n')的代碼…… 35

3.7 是否可以安全地認為,一旦&&和||左邊的表達式已經決定了整個表達式的結果,則右邊的表達式不會被求值? 36 

3.8 為什么表達式printf("%d %d", f1(), f2()); 先調用了f2?我覺得逗號表達式應該確保從左到右的求值順序。 36 

3.9 怎樣才能理解復雜表達式并避免寫出未定義的表達式?“序列點”是什么? 36

3.10 在a[i] = i ;中,如果不關心a[]的哪一個分量會被寫入,這段代碼就沒有問題,i也的確會增加1,對嗎? 38 

3.11 人們總是說i=i 的行為是未定義的。可我剛剛在一個ANSI編譯器上嘗試過,其結果正如我所期望的。 38 

3.12 我不想學習那些復雜的規則,怎樣才能避免這些未定義的求值順序問題呢? 38



其他的表達式問題 39

*3.13  i和i 有什么區別? 39

3.14 如果我不使用表達式的值,那我應該用i 還是 i來做自增呢? 39

3.15 我要檢查一個數是不是在另外兩個數之間,為什么if(a b c)不行? 40

3.16 為什么如下的代碼不對?int a=1000, b=1000; long int c=a * b; 40

3.17 為什么下面的代碼總是給出0?double degC, degF; degC= 5.0 / 9 * (degF - 32); 40

3.18 需要根據條件把一個復雜的表達式賦給兩個變量中的一個。可以用下面這樣的代碼嗎?((condition) a : b)= complicated_expression; 41 

3.19 我有些代碼包含這樣的表達式。a b=c : d 有些編譯器可以接受,有些卻不能。為什么? 41



保護規則 42

3.20 “semantics of‘’change in ANSI C”的警告是什么意思? 42

3.21 “無符號保護”和“值保護”規則的區別在哪里? 42



第4章 指針 45



基本的指針應用 45

4.1 指針到底有什么好處? 45

4.2 我想聲明一個指針并為它分配一些空間,但卻不行。這些代碼有什么問題呢?char *p; *p =malloc(10); 45 

4.3 *p 自增p還是p所指向的變量? 46



指針操作 46

4.4 我用指針操作int數組的時候遇到了麻煩。 46

4.5 我有一個char *型指針碰巧指向一些int型變量,我想跳過它們。為什么((int *)p) ; 這樣的代碼不行? 47

4.6 為什么不能對void *指針進行算術操作? 47

4.7 我有些解析外部結構的代碼,但是它卻崩潰了,顯示出了“unaligned access”(未對齊的訪問)的信息。這是什么意思? 47



作為函數參數的指針 47

4.8 我有個函數,它應該接受并初始化一個指針:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是當我如下調用時:int *ip; f(ip); 調用者的指針沒有任何變化。 47 

4.9 能否用void ** 通用指針作為參數,使函數模擬按引用傳遞參數   48

4.10 我有一個函數extern intf(int *); ,它接受指向int型的指針。我怎樣用引用方式傳入一個常數?調用f(&5);似乎不行。 49 

4.11 C語言可以“按引用傳參”嗎? 50



其他指針問題 50

4.12 我看到了用指針調用函數的不同語法形式。到底怎么回事? 50

4.13 通用指針類型是什么?當我把函數指針賦向void *類型的時候,編譯通不過。 51

4.14 怎樣在整型和指針之間進行轉換?能否暫時把整數放入指針變量中,或者相反? 51

*4.15 我怎樣把一個int變量轉換為char *型?我試了類型轉換,但是不行。 52



第5章 空指針  53



空指針和空指針常量 53

5.1 臭名昭著的空指針到底是什么? 53

5.2 怎樣在程序里獲得一個空指針? 54

5.3 用縮寫的指針比較“if(p)”檢查空指針是否有效?如果空指針的內部表達不是0會怎樣? 55



NULL 宏 56

5.4 NULL是什么,它是怎么定義的? 56

5.5 在使用非零位模式作為空指針的內部表示的機器上,NULL 是如何定義的? 56

5.6 如果NULL定義成#define NULL((char *)0) ,不就可以向函數傳入不加轉換的NULL 了嗎? 57

5.7 我的編譯器提供的頭文件中定義的NULL為0L。為什么? 57

5.8 NULL可以合法地用作函數指針嗎? 57

5.9 如果NULL和0作為空指針常量是等價的,那我到底該用哪一個呢? 58

5.10 但是如果NULL的值改變了,比如在使用非零內部空指針的機器上,用NULL(而不是0)

不是更好嗎? 58 

5.11 我曾經使用過一個編譯器,不使用NULL就不能編譯。 58

5.12 我用預處理宏#define Nullptr(type)(type *)0幫助創建正確類型的空指針。 59



回顧 59

5.13 這有點奇怪:NULL可以確保是0,但空(null)指針卻不一定? 59

5.14 為什么有那么多關于空指針的疑惑?為什么這些問題如此頻繁地出現? 60

5.15 有沒有什么簡單點兒的辦法理解所有這些與空指針有關的東西呢? 60

5.16 考慮到有關空指針的所有這些困惑,要求它們的內部表示都必須為0不是更簡單嗎? 60

5.17 說真的,真有機器用非零空指針嗎,或者不同類型用不同的表示? 61



地址0 上到底有什么? 61

5.18 運行時的整數值0轉換為指針以后一定是空指針嗎? 61

5.19 如何訪問位于機器地址0處的中斷向量?如果我將指針值設為0,編譯器可能會自動將它轉換為非零的空指針內部表示。 62 

5.20 運行時的“null pointer assignment”錯誤是什么意思?應該怎樣捕捉它? 62



第6章 數組和指針 63



數組和指針的基本關系 63

6.1 我在一個源文件中定義了char a[6],在另一個源文件中聲明了extern char *a。為什么不行? 63

6.2 可是我聽說char a[]和char *a是等價的。是這樣的嗎? 63

6.3 那么,在C語言中“指針和數組等價”到底是什么意思? 64

6.4 既然它們這么不同,那為什么作為函數形參的數組和指針聲明可以互換呢? 65



數組不能被賦值 66

6.5 為什么不能這樣向數組賦值?extern char *getpass(); char str[10]; str=getpass("Enter password:"); 66 

6.6 既然不能向數組賦值,那這段代碼為什么可以呢?int f(char str[]){ if(str[0] == '\0') str="none";…} 66 

6.7 如果你不能給它賦值,那么數組如何能成為左值呢? 66



回顧 67

6.8 現實地講,數組和指針的區別是什么? 67

6.9 有人跟我講,數組不過是常指針。這樣講準確嗎? 67

6.10 我還是很困惑。到底指針是一種數組,還是數組是一種指針? 67

6.11 我看到一些“搞笑”的代碼,包含5["abcdef"]這樣的“表達式”。這為什么是合法的C語言表達式呢? 68



數組的指針  68

6.12 既然數組引用會退化為指針,如果array是數組,那么array和&array又有什么區別呢? 68

6.13 如何聲明一個數組的指針? 69



動態數組分配 70

6.14 如何在運行時設定數組的大小?怎樣才能避免固定大小的數組? 70

6.15 我如何聲明大小和傳入的數組一樣的局部數組? 70

6.16 如何動態分配多維數組? 71

6.17 有個很好的竅門,如果我這樣寫:int realarray[10]; int *array = &realarray[-1]; 我就可以把“array”當作下標從1 開始的數組。 72



函數和多維數組 73

6.18 當我向一個接受指針的指針的函數傳入二維數組的時候,編譯器報錯了。 73

6.19 我怎樣編寫接受編譯時寬度未知的二維數組的函數? 74

6.20 我怎樣在函數參數傳遞時混用靜態和動態多維數組? 74



數組的大小  75

6.21 當數組是函數的參數時,為什么sizeof不能正確報告數組的大小? 76

6.22 如何在一個文件中判斷聲明為extern的數組的大小(例如,數組定義和大小在另一個文件中)?sizeof操作符似乎不行。 76 

6.23 sizeof返回的大小是以字節計算的,怎樣才能判斷數組中有多少個元素呢? 76



第7 章 內存分配 77



基本的內存分配問題 77

7.1 為什么這段代碼不行?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", answer); 77

7.2 我的strcat() 不行。我試了下面的代碼:char *s1= "Hello,"; char *s2= "world!"; char *s3= strcat(s1, s2);但是我得到了奇怪的結果。 78 

7.3 但是strcat的文檔說它接受兩個char *型參數。我怎么知道(空間)分配的事情呢? 78

*7.4 我剛才試了這樣的代碼:char *p; strcpy(p, "abc");它運行正常。怎么回事?為什么它沒有出錯? 79 

*7.5 一個指針變量分配多少內存? 79

7.6 我使用fgets將文件的所有行讀入一個數組,為什么讀入的每一行都是**后一行的內容呢? 79

7.7 我有個函數,本該返回一個字符串,但當它返回調用者的時候,返回的字符串卻是垃圾信息。

為什么?  80

*7.8 那么返回字符串或其他聚集的正確方法是什么呢? 81



調用malloc 81

7.9 為什么在調用malloc()時報出了“waring: assignment of pointer from integer lacks a cast”? 81

7.10 為什么有些代碼小心翼翼地把malloc返回的值轉換為分配的指針類型? 81

*7.11 在調用malloc()的時候,錯誤“不能把void * 轉換為int * ”是什么意思? 82

7.12 我看到下面這樣的代碼:char *p = malloc(strlen(s) 1); strcpy(p,s); 難道不應該是malloc ((strlen(s) 1) * sizeof(char)) 嗎? 82 

7.13 我為malloc寫了一個小小的封裝函數。它為什么不行? 82

7.14 我想聲明一個指針并向它分配一些內存,但是不行。這樣的代碼有什么問題?char *p; *p = malloc(10); 82 

7.15 我如何動態分配數組? 83

7.16 怎樣判斷還有多少內存? 83

7.17 malloc(0)是返回空指針還是指向0個字節的指針? 83

7.18 我聽說有的操作系統在程序使用的時候才真正分配malloc申請的內存。這合法嗎? 83



有關malloc 的問題 83

7.19 為什么malloc返回了離譜的指針值?我的確讀過問題7.9,而且也在調用之前包含了extern void *malloc();聲明。  83 

7.20 我用一行這樣的代碼分配一個巨大的數組,用于數值運算:double *array = malloc (256 *256 *sizeof(double));malloc()并沒有返回空指針,但是程序運行得有些奇怪,好像改寫了某些內存,或者malloc()并沒有分配我申請的那么多內存。為什么? 84 

7.21 我的PC機有8兆內存。為什么我只能分配640K左右的內存? 84

7.22 我的應用程序非常依賴數據結構的節點的動態分配,而malloc/free的代價成了瓶頸。我該怎么做? 84

7.23 我的程序總是崩潰,顯然發生在malloc內部的某個地方。但是我看不出哪里有問題。是malloc有bug嗎? 84



釋放內存 85

7.24 動態分配的內存一旦釋放之后就不能再使用,是吧? 85

7.25 為什么在調用free()之后指針沒有變空?使用(賦值、比較)釋放之后的指針有多么不安全? 86

7.26 當我調用malloc()為一個函數的局部指針分配內存時,我還需要用free()顯式地釋放嗎? 86

7.27 我在分配一些結構,它們包含指向其他動態分配的對象的指針。我在釋放結構的時候,還需要釋放每一個下級指針嗎? 86 

7.28 我必須在程序退出之前釋放分配的所有內存嗎? 86

7.29 我有個程序分配了大量的內存,然后又釋放了。但是從操作系統看,內存的占用率卻并沒有變回去。 87 



分配內存塊的大小 87 

7.30 free()怎么知道有多少字節需要釋放? 87

7.31 那么我能否查詢malloc包,以查明可分配的**大塊是多大? 87

7.32 為什么sizeof不能告訴我它所指的內存塊的大小? 87



其他分配函數 88

7.33 (像問題6.14中那樣)動態分配數組之后,還能改變它的大小嗎? 88

7.34 向realloc()的第 一個參數傳入空指針合法嗎?你為什么要這樣做? 89

7.35 calloc()和malloc()有什么區別?應該用哪一個?利用calloc 的零填充功能安全嗎?free()可以釋放calloc()分配的內存嗎,還是需要一個cfree()?  90

7.36 alloca是什么?為什么不提倡使用它? 91



第8章 字符和字符串 92



8.1 為什么strcat(string, '!'); 不行? 92

8.2 我想檢查一個字符串是否跟某個值匹配。為什么這樣不行?if(string == "value") 92

8.3 如果我可以寫char a[] = "Hello, world!"; 那為什么不能寫char a[14]; a = "Hello, world!"; 93 

8.4 為什么我的strcat 不行?我試了char *s1="Hello,"; char *s2="world!"; char *s3 =strcat(s1, s2);可得到的結果很奇怪。 93 

8.5 char a[]= "string literal"; 和char *p= "string literal"; 初始化有什么區別?當我對p[i]賦值的時候,程序崩潰了。 93 

8.6 我怎么得到與字符相對應的數字(即ASCII 或其他字符集下的)值?反過來又該怎么做? 94

8.7 C語言有類似其他語言的"substr"(提取子串)這樣的函數嗎? 94

8.8 我將用戶鍵入的字符串讀入數組,然后再顯示出來。當用戶鍵入\n這樣的序列時,為什么不能正確處理呢? 94 

8.9 我注意到sizeof('a')是2而不是1(即不是sizeof(char)),是不是我的編譯器有問題? 94

8.10 我正開始考慮多語言字符集的問題。是否有必要擔心sizeof(char)會被定義為2,以便表達16位的字符集呢? 95 



第9章 布爾表達式和變量 96

9.1 C語言中布爾值該用什么類型?為什么它不是一個標準類型?我應該用#define或enum定義真值和假值嗎? 96 

9.2 既然在C 語言中所有的非零值都被看作“真”,那是不是把TRUE 定義為1很危險?如果某個內建的函數或關系操作符“返回”不是1的其他值怎么辦?  97 

9.3 當p是指針時,if(p)是合法的條件表達式嗎? 98

9.4 我該使用像TRUE和FALSE這樣的符號名稱還是直接用1和0來作布爾常量? 98

9.5 我準備使用的一個第三方頭文件定義了自己的TRUE和FALSE,它們跟我已經開發的部分不兼容。我該怎么辦? 98 



第 10章 C預處理器 99



宏定義 99

10.1 我想定義一些函數式的宏,例如:#define square(x)x * x但它們并不總是正確的。為什么? 99

10.2 這里有一些的預處理宏,使用它們,我可以寫出更像Pascal的C代碼。你覺得怎么樣? 100

10.3 怎么寫一個交換兩個值的通用宏?  101

10.4 書寫多語句宏的**好方法是什么?  101

10.5 用typdef和預處理宏生成用戶定義類型有什么區別? 102



頭文件 102

10.6 我第 一次把一個程序分成多個源文件,我不知道該把什么放到.c文件,把什么放到.h文件。(“.h”到底是什么意思?) 102 

10.7 可以在一個頭文件中包含另一頭文件嗎? 103

10.8 完整的頭文件搜索規則是怎樣的?  104

10.9 我在文件的第 一個聲明就遇到奇怪的語法錯誤,但是看上去沒什么問題。 104

10.10 我使用了來自兩個不同的第三方庫的頭文件,它們都定義了相同的宏,如TRUE、FALSE、Min()和Max()等,但是它們的定義相互沖突,而且跟我在自己的頭文件中的定義也有沖突。我該怎么辦? 104 

10.11 我在編譯一個程序,看起來我好像缺少需要的一個或多個頭文件。誰能發給我一份? 105



條件編譯  105

10.12 怎樣構造比較字符串的#if預處理表達式? 105

10.13 sizeof操作符可以用在#if預處理指令中嗎? 106

10.14 我可以像這樣在#define行里使用#ifdef來定義兩個不同的東西嗎? 106

10.15 對typedef的類型定義有沒有類似#ifdef的東西? 106

10.16 我如何用#if表達式來判斷機器是高字節在前還是低字節在前? 107

10.17 為什么在我用#ifdef關掉的代碼行中報出了奇怪的語法錯誤? 107

10.18 我拿到了一些代碼,里邊有太多的#ifdef。我不想使用預處理器把所有的#include 和#ifdef都擴展開,有什么辦法只保留一種條件的代碼呢? 107 

10.19 如何列出所有的預定義宏? 107



奇異的處理 108

10.20 我有些舊代碼,試圖用這樣的宏來構造標識符:#define Paste(a, b) a/**/b 但是現在不行了。為什么? 108 

10.21 我有一個舊宏:#define CTRL(c) ('c' & 037)現在不能用了。為什么? 108

10.22 為什么宏#define TRACE(n) printf("TRACE: \%d\n", n) 報出警告“macro replacement within a string literal ”?它似乎把TRACE(count);擴展成了printf("TRACE: \%d\count", count); 109 

10.23 如何在宏擴展的字符串字面量中使用宏參數? 109

10.24 我想用ANSI 的“字符串化”預處理操作符#將符號常量的值放入消息中,但它總是對宏名稱而不是它的值進行字符串化。這是什么原因? 109 

10.25 我想用預處理器做某件事情,但卻不知道如何下手。 110



可變參數列表的宏 110

10.26 怎樣寫可變參數宏?如何用預處理器“關掉”具有可變參數的函數調用? 110

10.27 如何在通用的調試宏中包含__FILE__和__LINE__宏? 111
......
展開全部

你必須知道的495個C語言問題 作者簡介

Steve Summit,畢業于麻省理工學院,有15年的C編程經驗。他在Internet上廣受尊重,并且維護著Usenet新聞組comp.lang.c的FAQ列表。他當前從事C和UNIX的教學工作,并致力于各種C和UNIX項目,其重點是積極的可移植代碼和接口設計。

商品評論(0條)
暫無評論……
書友推薦
本類暢銷
編輯推薦
返回頂部
中圖網
在線客服
主站蜘蛛池模板: 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 工业雾炮机_超细雾炮_远程抑尘射雾器-世纪润德环保设备 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 烟台螺纹,烟台H型钢,烟台钢材,烟台角钢-烟台市正丰金属材料有限公司 | 禹城彩钢厂_钢结构板房_彩钢复合板-禹城泰瑞彩钢复合板加工厂 | 智能型高压核相仪-自动开口闪点测试仪-QJ41A电雷管测试仪|上海妙定 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | 蜗轮丝杆升降机-螺旋升降机-丝杠升降机厂家-润驰传动 | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 起好名字_取个好名字_好名网免费取好名在线打分 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 |