03 - const static extern
const是一個C語言的關鍵字,它限定一個變量不允許被改變。使用const可以在一定程度上提高程序的安全性和可靠性,再者在看別人的代碼作品的時候也可以有助于清晰理解const所起的作用。
?
1、const和#define的區別
(1)編譯器處理的方式不相同
define定義的宏是在預處理階段展開的,而const定義的常量則是在編譯階段使用的
(2)類型和安全檢查不同
define宏沒有類型,并且不做任何的類型檢查,僅僅是展開
const常量具有具體的類型,在編譯階段會執行類型檢查
(3)存儲方式不同
define定義的宏替換是在編譯前完成,并且有多少地方使用,就會出現多少個臨時常量的內存,并不會分配內存
const常量會在內存中分配
2、const變量vs常量
常量,例如5和“abc”等,肯定是只讀的,因為常量是被編譯器放在內存中的只讀區域,當然不能夠去修改。而只讀變量則是在內存中開辟一個地方來存放它的值,只不過這個值不允許被修改。C語言關鍵字const就是用來限定一個變量不允許被改變的修飾符。
const int n = 5; int a[n];在上面的這個例子當中,雖然變量n被修飾為一個只讀變量,但是并不是常量,而數組定義的時候,規定數組長度必須是常量,所以會報錯。也就是說,常量并不等于不可變的變量
3、const來限定內容
1 typedef char * pStr; 2 char string[4] = "abc"; 3 const char *p1 = string; //1式 4 const pStr p2 = string; //2式 5 p1++; 6 p2++;const使用的基本形式是:
const type m; // 限定m不可變。在第3行代碼中const這個關鍵詞修飾的是*p1,所以*p1是不可變的,但是p1是可變的,所以p1++是沒有問題的
在第4行代碼中,const修飾的是p2,所以p2是不可變的,也就是說第6行的代碼是錯誤的。
4、const vs指針
1)const在前面
1 const int nValue; // nValue是const 2 const char *pContent; // *pContent是const, pContent可變 3 const char* const pContent; // pContent和*pContent都是const2)const在后面
1 int const nValue; // nValue是const 2 char const * pContent; // *pContent是const, pContent可變 3 char* const pContent; // pContent是const,*pContent可變 4 char const* const pContent; // pContent和*pContent都是const1)和2)所做的聲明是一樣的效果
例子:
int const * p1,p2;在這里p2是const修飾的,而(*p1)是作為一個整體收到const修飾的。換句話說,也就是p1是可變的。在這個例子當中,p1是指向整形的指針,
?
——指針指向的變量不可變,但是指向可以改變
1 int x = 1; 2 int y = 2; 3 const int* px = &x; int const* px = &x; //這兩句表達式一樣效果 4 px = &y; //正確,允許改變指向 5 *px = 3; //錯誤,不允許改變指針指向的變量的值——指針指向的變量的值可以改變,指向不變
1 int x = 1; 2 int y = 2; 3 int* const px = &x; 4 px = &y; //錯誤,不允許改變指針指向 5 *px = 3; //正確,允許改變指針指向的變量的值
——指針指向的變量不可變,指向不可變
int x = 1;int y = 2;const int* const px = &x; int const* const px = &x;px = &y; //錯誤,不允許改變指針指向*px = 3; //錯誤,不允許改變指針指向的變量的值?
5、在定義宏的時候,也可以使用const來進行定義
在定義宏的時候,也可以使用const來進行定義宏,但是要注意一些問題。比如說,如果把const修飾的宏全部放到pch文件當中的話,會造成,項目中所有的.m文件中都會有這段聲明,產生重讀定義的問題,解決辦法就是重新新建一個.h 和.m文件,然后在.m中定義常量,然后在.h中用extern關鍵字進行引用就可以了
例如:
——在.m文件中做如下定義:
1 NSString * const HWAppKey = @"3235932662"; 2 NSString * const HWRedirectURI = @"http://www.baidu.com"; 3 NSString * const HWAppSecret = @"227141af66d895d0dd8baca62f73b700"; 4 NSString * const HWMyAge = @"20";——在.h文件當中用extern關鍵字進行引用
1 extern NSString * const HWAppKey; 2 extern NSString * const HWRedirectURI; 3 extern NSString * const HWAppSecret; 4 extern NSString * const HWMyAge;在用到這些聲明的全局變量的時候只要包含這個文件的頭文件即可。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *ID = @"cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];}cell.textLabel.text = [NSString stringWithFormat:@"第%ld行數據",indexPath.row];return cell;}在使用tableViewCell 的時候經常會出現上述的寫法,并且會定義一個static變量,這個變量在編譯期會對這個變量進行初始化賦值,也就是說這個變量要么是nil要么就是在定義初期的時候對其進行賦值,一般情況下,只能用NSString或者是基本類型。
static修飾的變量存儲在內存中的靜態存儲區,這塊內存在程序的運行期間都會存在。所以保證了static變量的唯一性和持久性。
——static變量不能寫在interface里面,會直接報錯。static變量只能放在方法里面或者放在implementation外面(通常放在implementation文件開始處),
#import "Printer.h"static int pageCount;@implemenation Printer...@end簡單的來說,const是靜態變量,在聲明過后即存在在內存中的特殊位置,下次使用的時候,從該內存中讀取上次的存儲的值
?
?
參考:
http://blog.163.com/fuxiaohui@126/blog/static/13174582620139319928864/
轉載于:https://www.cnblogs.com/SH9186ios/p/4649238.html
總結
以上是生活随笔為你收集整理的03 - const static extern的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的源码安装步骤(以安装ngin
- 下一篇: ADO.NET Entity Frame