程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 來自chrome的代碼裡的一個模板

來自chrome的代碼裡的一個模板

編輯:關於C語言

template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
然後使用這個arraysize宏就可以在編譯時求出數組的大小
 

初看這段代碼,我表示很糾結,發給同學討論了下,然後表示有點眉目了,其實這就是一個編譯時求數組大小的一個寫法,當然我們也可以寫成


#define arraysize(array) (sizeof(array)/sizeof(array[0])) 這樣的格式,這種格式相信所有人都能看懂,我想其最所以不這麼寫是因為考慮到效率問題吧,避免了上述寫法的除法運算,除運算則是在四則運算裡面最耗時的(傷不起的C++,效率高了,可讀性下降的不止一點兩點哈)
可以自己寫個小程序測試一下:
 1 #include "stdafx.h"
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4
 5 template <typename T, size_t N>
 6 char (&ArraySizeHelper(T (&array)[N]))[N];
 7 #define arraysize(array) (sizeof(ArraySizeHelper(array)))
 8
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11
12     double a[200];
13
14     double* b = new double [100];
15     int cnt = arraysize(a);
16     printf("%d ",cnt);
17
18     system("pause");
19
20     return 0;
21 }輸出是200,將a數組類型換成int,char等結果依舊是200,這個比較好理解,因為采用template模板編程,泛型編程.......但是這種用法只能確定編譯時段尺寸確定好了的數組,若不然如果是采用動態數組,比如將代碼15行中的a換成b,則編譯失敗.......

其實大致流程是:T[N]的引用->char[N]的引用,最後就是sizeof(char[N]),char其實就是Byte,輸出也即N ^_^

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