?? c.txt
字號:
19.可以用#include指令包含類型名不是".h"的文件嗎?
預處理程序將包含用#include指令指定的任意一個文件。例如,如果程序中有下面這樣一條語句,那么預處理程序就會包含macros.inc文件。
#include <macros.inc>
不過,最好不要用#include指令包含類型名不是".h"的文件,因為這樣不容易區分哪些文件是用于編譯預處理的。例如,修改或調試你的程序的人可能不知道查看macros.inc文件中的宏定義,而在類型名為".h"的文件中,他卻找不到在macros.inc文件中定義的宏。如果將macros.inc文件改名為macros.h,就可以避免發生這種問題。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-6 13:12:42
--
20.用enum關鍵字說明常量有什么好處?
用enum關鍵字說明常量(即說明枚舉常量)有三點好處:
(1)用enum關鍵字說明的常量由編譯程序自動生成,程序員不需要用手工對常量一一賦值。
(2)用enum關鍵字說明常量使程序更清晰易讀,因為在定義enum常量的同時也定義了一個枚舉類型標識符。
(3)在調試程序時通常可以檢查枚舉常量,這一點是非常有用的,尤其在不得不手工檢查頭文件中的常量值時。
不過,用enum關鍵字說明常量比用#define指令說明常量要占用更多的內存,因為前者需要分配內存來存儲常量。
以下是一個在檢測程序錯誤時使用的枚舉常量的例子:
enum Error_Code
{
OUT_OF_MEMORY,
INSUFFICIENT_DISK_SPACE,
LOGIC_ERROR,
FILE_NOT_FOUND
} ;
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-6 13:13:18
--
21.與用#define指令說明常量相比,用enum關鍵字說明常量有什么好處?
與用#define指令說明常量(即說明標識符常量)相比,用enum關鍵字說明常量(即說明枚舉常量)有以下幾點好處:
(1) 使程序更容易維護,因為枚舉常量是由編譯程序自動生成的,而標識符常量必須由程序員手工賦值。例如,你可以定義一組枚舉常量,作為程序中可能發生的錯誤的錯誤號,請看下例:
enum Error_Code
{
OUT_OF_MEMORY,
INSUFFICIENT_DISK_SPACE,
LOGIC_ERROR,
FILE+NOT_FOUND
} ;
在上例中,OUT_OF_MEMORY等枚舉常量依次被編譯程序自動賦值為0,1,2和3。
同樣,你也可以用#define指令說明類似的一組常量,請看下例:
#define OUT_OF_MEMORY 0
#define INSUFFICIENT_DISK_SPACE 1
#define LOGIC_ERROR 2
#define FILE_NOT_FOUND 3
上述兩例的結果是相同的。
假設你要增加兩個新的常量,例如DRIVE_NOT_READY和CORRUPT_FILE。如果常量原來是用enum關鍵字說明的,你可以在原來的常量中的任意一個位置插入這兩個常量,因為編譯程序會自動賦給每一個枚舉常量一個唯一的值;如果常量原來是用#define指令說明的,你就不得不手工為新的常量賦值。在上面的例子中,你并不關心常量的實際值,而只關心常量的值是否唯一,因此,用enum關鍵字說明常量使程序更容易維護,并且能防止給不同的常量賦予相同的值。
(2)使程序更易讀,這樣別人修改你的程序時就比較方便。請看下例:
void copy_file(char* source_file_name, char * dest_file_name)
{
......
Error_Code,err;
......
if(drive_ready()!=TRUE)
err=DRIVE_NOT_READY;
......
}
在上例中,從變量err的定義就可以看出;賦予err的值只能是枚舉類型Error_Code中的數值。因此,當另一個程序員想修改或增加上例的功能時,他只要檢查一下Error_Code的定義,就能知道賦給err的有效值都有哪些。
注意:將變量定義為枚舉類型后,并不能保證賦予該變量的值就是枚舉類型中的有效值。
在上例中,編譯程序并不要求賦予err的值只能是Error—Code類型中的有效值,因此,程序員自己必須保證程序能實現這一點。
相反,如果常量原來是用#define指令說明的,那么上例就可能如下所示:
void copy_file(char *source *file,char *dest_file)
{
......
int err;
......
if(drive_ready()!=TRUE)
err=DRIVE_NOT_READY;
......
}
當另一個程序員想修改或增加上例的功能時,他就無法立即知道變量err的有效值都有哪些,他必須先檢查頭文件中的#defineDRIVE_NOT_READY語句,并且寄希望于所有相關的常量都在同一個頭文件中定義。
(3)使程序調試起來更方便,因為某些標識符調試程序能打印枚舉常量的值。這一點在調試程序時是非常用的,因為如果你的程序在使用枚舉常量的一行語句中停住了,你就能馬上檢查出這個常量的值;反之,絕大多數調試程序無法打印標識符常量的值,因此你不得不在頭文件中手工檢查該常量的值。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-6 13:13:47
--
22.使用宏更好,還是使用函數更好?
這取決于你的代碼是為哪種情況編寫的。宏與函數相比有一個明顯的優勢,即它比函數效率更高(并且更快),因為宏可以直接在源代碼中展開,而調用函數還需要額外的開銷。但是,宏一般比較小,無法處理大的、復雜的代碼結構,而函數可以。此外,宏需要逐行展開,因此宏每出現一次,宏的代碼就要復制一次,這樣你的程序就會變大,而使用函數不會使程序變大。
一般來說,應該用宏去替換小的、可重復的代碼段,這樣可以使程序運行速度更快;當任務比較復雜,需要多行代碼才能實現時,或者要求程序越小越好時,就應該使用函數。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-6 13:14:30
--
23.#include <file>和#include“file”有什么不同?
在C程序中包含文件有以下兩種方法:
(1)用符號“<”和“>”將要包含的文件的文件名括起來。這種方法指示預處理程序到預定義的缺省路徑下尋找文件。預定義的缺省路徑通常是在INCLUDE環境變量中指定的,請看下例:
INCLUDE=C:\\COMPILER\\INCLUDE;S:\\SOURCE\\HEADERS;
對于上述INCLUDE環境變量,如果用#include<file>語句包含文件,編譯程序將首先到C:\\COMPILER\\INCLUDE目錄下尋找文件;如果未找到,則到S:\\SOURCE\\HEADERS
目錄下繼續尋找;如果還未找到,則到當前目錄下繼續尋找。
(2)用雙引號將要包含的文件的文件名括起來。這種方法指示預處理程序先到當前目錄下尋找文件,再到預定義的缺省路徑下尋找文件。
對于上例中的INCLUDE環境變量,如果用#include“file”語句包含文件,編譯程序將首先到當前目錄下尋找文件;如果未找到,則到C:\\COMPILER\\INCLUDE目錄下繼續尋找;如果還未找到,則到S:\\SOURCE\\HEADERS目錄下繼續尋找。
#include<file>語句一般用來包含標準頭文件(例如stdio.h或stdlib.h),因為這些頭文件極少被修改,并且它們總是存放在編譯程序的標準包含文件目錄下。#include“file”語句一般用來包含非標準頭文件,因為這些頭文件一般存放在當前目錄下,你可以經常修改它們,并且要求編譯程序總是使用這些頭文件的最新版本。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-6 13:15:07
--
24.包含文件可以嵌套嗎?
包含文件可以嵌套,但你應該避免多次包含同一個文件(見5.3)。
過去,人們認為頭文件嵌套是一種不可取的編程方法,因為它增加了MAKE程序中的依賴跟蹤函數(dependencytrackingfunction)的工作負擔,從而降低了編譯速度。現在,通過引入預編譯頭文件(precompiledheaders,即所有頭文件和相關的依賴文件都以一種已被預編譯的狀態存儲起來)這樣一種技術,許多流行的編譯程序已經解決了上述問題。
許多程序員都喜歡建立一個自己的頭文件,使其包含每個模塊所需的每個頭文件。這是一個頭文件。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-6 13:17:15
--
25.連接運算符“##”有什么作用?
連接運算符“##”可以把兩個獨立的字符串連接成一個字符串。在C的宏中,經常要用到“##”運算符,請看下例:
#include<stdio.h>
#define SORT(X) sort_function # # X
void main(vOid);
void main(vOid)
{
char *array;
int elements,element_size;.
SORT(3) (array,elements,element_size);
}
在上例中,宏SORT利用“##”運算符把字符串sort_function和經參數x傳遞過來的字符串連接起來,這意味著語句
SORT(3)(array,elemnts,element_size);
將被預處理程序轉換為語句
sort_function3(array,elements,element_size);
從宏SORT的用法中你可以看出,如果在運行時才能確定要調用哪個函數,你可以利用“##”運算符動態地構造要調用的函數的名稱。
--------------------------------------------------------------------------------
-- 作者:絕望之星
-- 發布時間:2005-4-7 12:56:48
--
我頂!!!
--------------------------------------------------------------------------------
-- 作者:設計部唐成城
-- 發布時間:2005-4-7 21:11:03
--
好象太深奧了
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-9 23:14:48
--
別就光頂啊 幫著我擴充一下啊
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-9 23:38:12
--
26.怎樣取消一個已定義的宏?
利用預處理指令#undef可以取消已定義的宏。許多程序員都喜歡按自己的風格定義一些常用的標識符,例如TRUE和FALSE。你可以在程序中檢查TRUE和FALSE是否已被定義,如果已被定義,就取消原來的定義,然后按自己的風格重新定義。請看下例:
#ifdef TRUE /* Check to see if TRUE has been defined yet */
#undef TRUE /*If so,undefine it */
#endif
#define TRUE 1 /*Define TRUE the waywe want it denned */
#ifdef FALSE /*Check tO see ifFALSE has beendefined yet*/
#undef FALSE /*if so,undefine it */
#endif
#define FALSE !TRUE /*Define FALSE the waywe want it defined*/
#undef指令的另一個作用是避免標識符的重復定義。例如,如果刪去上例中的#undef語句,在編譯上例時就會產生重復定義同一個標識的警告;有了#undef語句,你就可以避開上述警告,并能保證有效地定義標識符。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-9 23:41:36
--
27.串拷貝(strcpy)和內存拷貝(memcpy)有什么不同?它們適合于在哪種情況下使用?
strcpy()函數只能拷貝字符串。strcpy()函數將源字符串的每個字節拷貝到目錄字符串中,當遇到字符串末尾的null字符(\\0)時,它會刪去該字符,并結束拷貝。
memcpy()函數可以拷貝任意類型的數據。因為并不是所有的數據都以null字符結束,所以你要為memcpy()函數指定要拷貝的字節數。
在拷貝字符串時,通常都使用strcpy()函數;在拷貝其它數據(例如結構)時,通常都使用memcpy()函數。
以下是一個使用strcpy()函數和memcpy()函數的例子:
#include <stdio. h>
#include <string. h>
typedef struct cust-str {
int id ;
char last_name [20] ;
char first_name[l5];
} CUSTREC;
void main (void);
void main (void)
{
char * src_string = "This is the source string" ;
char dest_string[50];
CUSTREC src_cust;
CUSTREC dest_cust;
printf("Hello! I\'m going to copy src_string into dest_string!\\n");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -