發表文章

目前顯示的是 二月, 2012的文章

Objective-C與C++的不同

Unions 在C語言的簡單介紹

References:
1. http://publications.gbdirect.co.uk/c_book/chapter6/unions.html

OS      : Ubuntu 11.10 x86_64
gcc      : 4.6.1


        最近寫C語言用到了union這個structure,一開始還不是很懂在作什麼,所以看了網路上的一些範例以及說明,以下是依照我的理解來說明。


        簡單的說就是union裏面的變數是共用同一個記憶體,資料是以最後一筆寫入變數為主,而且分配的記憶體是以最大的資料結構做為分配的依據。所以我用以下的範例來說明,當最後一筆資料是寫入un_double所以之前un_char,un_int所寫的入資料將會被換掉,畢竟是使用同一塊記憶體。在記憶體配置的部份,最大是double的size是8bytes,所以ex_type的size是8bytes。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <stdio.h>#include <stdarg.h>struct ex_type{union{double   un_double;char    un_char;int     un_int;};};int main(int argc ,char** argv){struct ex_type tt ;     tt.un_char='a';     tt.un_int=10;     tt.un_double=10.5;printf("struct ex_type size = %d\n",sizeof(struct ex_type));printf("double size = %d\n",sizeof(double));printf("char   size = %d\n",sizeof(char));printf("int    size = %d\n",sizeof(int))

__VA_ARGS__的使用

Reference:
1. http://blog.linux.org.tw/~jserv/
2. http://www.jeffhung.net/blog/articles/jeffhung/1013/
3. http://www.cash.idv.tw/wordpress/?p=1531
4. http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html


         __VA_ARGS__是一個可變的marco(Variadic Macros)。為什麼要使用這個功能呢?在code中避免用到太多的#ifndef/#endif,當你的code充滿#ifndef/#endif會讓你的code變得很難閱讀跟理解,所以可以利用__VA_ARGS__跟marco來取代#ifndef/#endif。


        當寫程式的過程通常會需要輸出一些訊息,來方便我們Debug。程式會分測試版跟釋出版,所以常常用大量使用#ifndef/#endif,當然使用#ifndef/#endif這種方式也不是不可以,但是就跟剛剛講得code會變得很難閱讀,所以可以多多利用__VA_ARGS__。


         首先來瞭解__VA_ARGS__能做什麼。直接看以下的範例,當我定義一個marco叫做DBG(...),括號中的... 。就是說你可以輸入任何的參數,然後就可以用__VA_ARGS__來代表...所傳入的參數。


以下的範例很簡單,當我DEBUG的Flag設定為1,這個時候printf("Hello World\n");才會出現在編譯完的檔案,但這種寫法不是很好,所以只是參考用以方便瞭解__VA_ARGS__。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h>#include <stdarg.h>#define DEBUG 1#define DBG(...) \         if(DEBUG){__VA_ARGS__;}int main(int argc,char*argv){     DBG(printf("Hello World\n"););return0;}
#Output 
Hello World
       …