今天發現了程式中有一個警告訊息"function declaration isn't a prototype",想解決它,但是又不太懂它的意思,所以就上網查了一下。結果順便還學了一下歷史。
原文:func(void):C 與 C++ 函式宣告的小差異
2014年8月26日 星期二
2014年1月28日 星期二
變數的長度及 printf 參數。
今天要把 MAC address 由字串轉成 16 進制數字時,才發現很麻煩。因為它是 6 個 bytes,太長了。尋找解決的過程經歷了一些故事,所以來記錄一下。
其實之前有碰到 memory address 的部份,由使用者輸進來的是字串,但運算時常常需要把它轉成 16 進制數字。在我手上的程式一般是使用 simple_strtoul 這個函式,但是它的傳回值是 unsigned long ,只有 4 個 bytes,所以長度不夠。
其實之前有碰到 memory address 的部份,由使用者輸進來的是字串,但運算時常常需要把它轉成 16 進制數字。在我手上的程式一般是使用 simple_strtoul 這個函式,但是它的傳回值是 unsigned long ,只有 4 個 bytes,所以長度不夠。
2014年1月9日 星期四
"!!" in C - C 語言中的兩個驚嘆號
有時候,會看到這樣的用法:
!!value
大家應該都知道 "!" 表示 "NOT",所以加了 "!" 0 會變 1 ,1會變 0。
以前學校是這麼教的,不過,其中倒是有一些小地方,不是這麼單純的。
首先,因為 C 語言的型態是很自由的(以前老師喜歡說是「很亂來的」)
如果變數的值單純的是 0 或 1,當然狀況就是像上面說的 0 變 1,1 變 0。
!!value
大家應該都知道 "!" 表示 "NOT",所以加了 "!" 0 會變 1 ,1會變 0。
以前學校是這麼教的,不過,其中倒是有一些小地方,不是這麼單純的。
首先,因為 C 語言的型態是很自由的(以前老師喜歡說是「很亂來的」)
如果變數的值單純的是 0 或 1,當然狀況就是像上面說的 0 變 1,1 變 0。
2013年12月25日 星期三
printf 印出 IP address
最近 trace code(u-boot) 時發現,printf 現在可以印出 IP 及 MAC 之類的 address 型態。
%pI4:印出IPv4位址,變數型態為 unsigned long 的指標。
%pI6:印出IPv6位址,變數型態為 unsigned ling 的指標。
%pM:印出MAC位址,變數型態為 unsigned char 的指標。
這樣它就可以直接把 IP, MAC address 印出來。
EX:
typedef ulong IPaddr_t;
IPaddr_t NetOurSubnetMask;
printf("NetOurSubnetMask : %pI4\n", &NetOurSubnetMask);
unsigned char env_enetaddr[6];
printf("Address in environment is %pM\n", env_enetaddr);
而變數裡面的值,IP的部份就是16進制的值直接連在一起。
例如:
192.168.10.100 => C0A80A64
192 = C0
168 = A8
10 = 0A
100 = 64
MAC 的部份也是一樣是16進制的值,所以用 %s、%c會印不出來。
反而直接用%x一個一個去印是印得出來的。
這功能原本可能來自新版的 Linux Kernel 的 printk
參考:
https://www.kernel.org/doc/Documentation/printk-formats.txt
%pI4:印出IPv4位址,變數型態為 unsigned long 的指標。
%pI6:印出IPv6位址,變數型態為 unsigned ling 的指標。
%pM:印出MAC位址,變數型態為 unsigned char 的指標。
這樣它就可以直接把 IP, MAC address 印出來。
EX:
typedef ulong IPaddr_t;
IPaddr_t NetOurSubnetMask;
printf("NetOurSubnetMask : %pI4\n", &NetOurSubnetMask);
unsigned char env_enetaddr[6];
printf("Address in environment is %pM\n", env_enetaddr);
而變數裡面的值,IP的部份就是16進制的值直接連在一起。
例如:
192.168.10.100 => C0A80A64
192 = C0
168 = A8
10 = 0A
100 = 64
MAC 的部份也是一樣是16進制的值,所以用 %s、%c會印不出來。
反而直接用%x一個一個去印是印得出來的。
這功能原本可能來自新版的 Linux Kernel 的 printk
參考:
https://www.kernel.org/doc/Documentation/printk-formats.txt
2013年11月7日 星期四
C 語言預設變數 備忘
這也是一個常常會混亂的東西@@,記憶力越來越差,不知道跟什麼東西都能 Google 有關?還是年紀有關?
GCC 中有事先定義了一些變數,讓我們可用,其中 Debug 時常用的就是 __FILE__,__LINE__跟我常常會弄混的 __func__。別人都是大寫,就它是小寫。其實本來是__FUNCTION__,但後來 GNU 已經不建議使用(原因不明),所以改成了 __func__。
結果我就會搞不清到底是:
__func__,__function__,__FUNC__ 還是 __FUNCTION__。
實際上查了一下,除了這三個還有其它的,只是比較不常用。
1. __BASE_FILE__
完整的原始檔案路徑
2. __cplusplus
表示該檔案由 g++ 所編譯,當成 C++ 的檔案
3. __DATE__
編譯的日期
4. __TIME__
編譯的時間
5. __FILE__
原始檔名
6. __LINE__
所在行數
7. __VERSION__
gcc 版本
8. __func__
為了避免混淆,我就不提另一個了
GCC 中有事先定義了一些變數,讓我們可用,其中 Debug 時常用的就是 __FILE__,__LINE__跟我常常會弄混的 __func__。別人都是大寫,就它是小寫。其實本來是
結果我就會搞不清到底是:
__func__,
實際上查了一下,除了這三個還有其它的,只是比較不常用。
1. __BASE_FILE__
完整的原始檔案路徑
2. __cplusplus
表示該檔案由 g++ 所編譯,當成 C++ 的檔案
3. __DATE__
編譯的日期
4. __TIME__
編譯的時間
5. __FILE__
原始檔名
6. __LINE__
所在行數
7. __VERSION__
gcc 版本
8. __func__
為了避免混淆,我就不提另一個了
訂閱:
文章 (Atom)