為什麼標準標頭檔案都有類似以下的結構?
#ifndef __incvxworksh
#define __incvxworksh
#ifdef __cplusplus
extern
"c"#endif
#endif
/* __incvxworksh */
#ifndef __incvxworksh
#define __incvxworksh
#endif
的作用是防止函式被重複引用。
作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。函式被c++編譯後在symbol庫中的名字與c語言的不同。例如,假設某個函式的原型為:
void foo(int x, int y);
該函式被c編譯器編譯後在symbol庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函式名和函式引數數量及型別資訊,c++就是靠這種機制來實現函式過載的。
為了實現c和c++的混合程式設計,c++提供了c連線交換指定符號extern "c"來解決名字匹配問題,函式宣告前加上extern "c"後,則編譯器就會按照c語言的方式將該函式編譯為_foo,c++函式可以呼叫c的函式了。
#endif就近原則
對條件編譯(#ifdef,#else,#endif,#if等)進行說明。以下分3種情況:
1:情況1:
#ifdef _***x
…程式段1…
#else
…程式段2…
#endif
這表明如果識別符號_***x已被#define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。
例:#define num……
…#ifdef num
printf(「之前num有過定義啦!\n」);
#else
printf(「之前num沒有過定義!\n」);
#endif
}如果程式開頭有#define num這行,即num有定義,碰到下面#ifdef num的時候,當然執行第乙個printf。否則第二個printf將被執行。
我認為,用這種,可以很方便的開啟/關閉整個程式的某項特定功能。
2:情況2:
#ifndef _***x
…程式段1…
#else
…程式段2…
#endif
這裡使用了#ifndef,表示的是if not def。當然是和#ifdef相反的狀況(如果沒有定義了識別符號_***x,那麼執行程式段1,否則執行程式段2)。例子就不舉了。
3:情況3:
#if 常量
…程式段1…
#else
…程式段2…
#endif
這裡表示,如果常量為真(非0,隨便什麼數字,只要不是0),就執行程式段1,否則執行程式段2。
我認為,這種方法可以將測試**加進來。當需要開啟測試的時候,只要將常量變1就好了。而不要測試的時候,只要將常量變0。
牛客網C 刷題
今天刷了些c 的題,就其中物件導向分享一下我的感悟。首先區分一下物件導向和面向過程 物件導向是首先抽象出各種物件 各種類 把資料和方法都封裝在物件中 類 然後各個物件之間發生相互作用。面向過程是將問題分解成若干步驟 動作 每個步驟 動作 用乙個函式來實現,在使用的時候,將資料傳遞給這些函式。stl有...
牛客網刷題
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 立華奏在學習初中數學的時候遇到了這樣一道大水題 設箱子內有 n 個球,其中給 m 個球打上標記,設一次摸球摸到每乙個球的概率均等,求一次摸球摸到打標記的球的概率 e...
牛客網刷題
時間限制 c c 2秒,其他語言4秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 立華奏是乙個剛剛開始學習 oi 的萌新。最近,實力強大的 qingyu 當選了 iods 9102 的出題人。眾所周知,iods 是一場極其毒瘤的比賽。為了在這次...