今天在網上爬文, 無意間學到了 named initializer 這個到 C99 才出現的語法.

enum 的應用例子


MagicJackTing 發表在 痞客邦 留言(0) 人氣()

struct alignment
C 語言的編譯器有一個內建的巨集 sizeof() 可以用來取得配置給變數的記憶體大小. 例如:

uint32_t varX = 1234;
int size;

size = sizeof(varX);

MagicJackTing 發表在 痞客邦 留言(7) 人氣()

寫 C 程式時偶而會遇到函數的原型宣告多設了一些暫時沒有用到的參數, 一般狀況下只要修改一下標頭檔中的宣告以及實際 C 函數的定義就好了. 不過偶而也會遇到不能改的情形, 例如:
套用某些框架系統時, 函數的原型宣告是框架系統提供的. (一改大概框架系統就不用升版了)
使用函數庫中某個函數的 call back, 而函數庫改不動, 或者沒原始程式, 沒得改.
在開發 embedded system 時, 我們需要實作或者改寫一些函數以取代 C 編譯器的一些預設行為, 例如: Keil ARM/MDK 中要把 printf() 改輸出到 SoC 的 UART.

MagicJackTing 發表在 痞客邦 留言(5) 人氣()

Mem Map2
C 語言的變數有所謂的 storage class, 初學時對當中的差異並不是很容易弄清楚, 後來我把各種條件稍作整理, 於是有了下面的表格:



C 語言變數


條件/狀況
外部變數
(全域變數)
靜態變數
自動變數
(區域變數)
函數參數


大分類
全域變數
區域變數
Key Word

static
static
auto (可略)

定義/宣告註1位置
函數外部
函數內 (或者 {} 區塊內)
函數本體
變數名稱重複
編譯錯誤. 專案中所有全域變數名稱需唯一
  • 與同一區塊內的變數同名時, 編譯錯誤.
  • 與區塊外層變數同名時, 外層變數被遮蔽.

在外部檔案 (.c/.h) 中使用(或參考)
外部檔案中變數宣告的前面加上 extern 即可
外部檔案中無法使用(或參考)
在定義的區塊外即無法使用
函數區塊外即無法使用
可視範圍註2
scope
自定義位置 (不必需在檔案的最前面) 至檔案結束
函數內 (或者 {} 區塊內)
函數內
生命期註3
life-time
程式執行期間 (或永久)
函數內 (或者 {} 區塊內)
函數內
初值(未設初值時)
0 (因為是使用 .bss 區段的關係)
未知
編譯錯誤. 參數個數不一致註4
初值設定限制註5
及其執行時機
限制只能使用常數運算式
只執行一次, main() 執行前由 "可載入執行檔 ELF" (或二進位影像 binary image) 拷貝至正確之 .data 區段位址內
無限制, 任何運算式均可.
每一次進入函數或區塊後立即執行
無限制
呼叫前執行設定
預設使用之記憶體區段
無初值
.bss註6
stack註6
register 或 stack註6

有初值
.data註6
stack註6
register 或 stack註6


MagicJackTing 發表在 痞客邦 留言(5) 人氣()

運算子優先權 (C 語言) Percedence Table




C 語言運算子優先權重表


運算子
Operator
說 明
Description
結合順序
Associativity
1
()
[]
->
.
++ --
Function call
Array subscripting
Element selection (of struct or union) through pointer
Element selection (of struct or union) by reference
increment/decrement (suffix) (註1)
左至右(註2)
2
!
~
++ --
+ -
*
&
(type)
sizeof
logic NOT
bitwise NOT
increment/decrement (prefix)
unary plus and minus
Indirection (dereference, right value)
Address-of (left value)
type cast
Size-of
右至左(註2)
3
* / %
Arithmetic multiplication, division, and remainder
左至右
4
+ -
Arithmetic addition, subtraction
左至右
5
<< >>
Bitwise left shift, right shift
左至右
6
< <=
> >=
Relational less than, not greater than
Relational greater than, not less than
左至右
7
== !=
Relational equal, not equal
左至右
8
&
Bitwise AND
左至右
9
^
Bitwise XOR
左至右
10
|
Bitwise OR
左至右
11
&&
Logical AND
左至右
12
||
Logical OR
左至右
13
?:
Ternary conditional
右至左
14
=
+= -=
*= /= %=
&= ^= |=
<<= >>=
Direct assignment
Assignment by sum, difference
Assignment by product, quotient, remainder
Assignment by bitwise AND, XOR, OR
Assignment by bitwise left shift, right shift
右至左
15
,
Comma
左至右


MagicJackTing 發表在 痞客邦 留言(6) 人氣()

以前以為 typedef 的功能可以用 #define 來完成, 用起來感覺功能也差不多, 例如:

typedef unsigned char bool; // 用這一行或者是下一行 二選一
//#define bool unsigned char

bool flag1, flag2;

MagicJackTing 發表在 痞客邦 留言(0) 人氣()

C 語言中 typedef 可以用來擴充 C 原有的資料型態. 通常我們會將某個資料型態或者將常用的資料型態組合給予一個比較直觀而易懂的別名. 定義別名之後我們就可以像使用原有的資料型態來宣告或定義變數一樣, 直接拿它來宣告或定義(註一, 註二)變數.

MagicJackTing 發表在 痞客邦 留言(7) 人氣()

程式在移植或者整合時, 有時會遇到使用結構來的定義程式所用到的資料的情形, 有時原作者是用一指向結構的指標來處理, 但是有時也會有直接用結構變數的情形.
這些程式我們在使用的時候按理應該盡量不要更動以免日後改版時造成問題, 不過要是遇到下面二種狀況那就...
原始程式是用指標來指向要處理的結構變數, 而現在我們想把規模縮小, 只會有一份結構變數, 同時也希望最佳化目的碼, 讓系統小一點, 快一點.
或者原始程式中把結構變數寫死了, 所有的函數都是針對那一個結構變數寫的, 結構變數生不出第二個 instance 來. 而我們卻是需要擴充一下, 讓它能處理多個結構變數.

MagicJackTing 發表在 痞客邦 留言(0) 人氣()

Type Cast to Func Pointer
外部資料結構


在寫 CPU 或介面晶片的驅動程式時, 經常會使用到某些固定位址, 如: ARM Cortex-M 把系統設定及狀態對應到記憶體的特定位址, 某些周邊 IC, 例如 PCI, USB... 也是使用一小段記憶體空間. (註: 常見的周邊 IC 暫存器定址有二種: 一種是只有二個位址空間, 一個是 '指令/地址暫存器', 一個是 '資料暫存器'; 另一種則是直接使用 CPU 的記憶體空間來對應)
軟體功力較佳的 SoC 晶片製造廠所提供的驅動程式, 通常會將這一小段記憶體空間以結構 (struct) 的方式定義好, 再使用 define 將特定的位址值 (常數), 定義成一虛擬變數. 當然如果晶片功能比較簡單就不見得是用這種方法.

MagicJackTing 發表在 痞客邦 留言(0) 人氣()

個人覺得 C 語言最神奇的地方是有好些個對等寫法




類型
相關運算子
寫法一
寫法二
說明/宣告
1.
(變數)取址
"&"
p
&x
p 為指標, 並且指向變數 x
2.
(指標)取值
"*"
*p
x
同上
3.
陣列與指標
"[]" and "*"
p[n]
*(p+n)
p 為陣列變數或者指標變數
4.
結構成員
"->" and "."
p->x
(*p).x
p 為指標, 並指向一結構
x 為該結構成員


MagicJackTing 發表在 痞客邦 留言(0) 人氣()

C 語言預設會幫我們作一些型別轉換的動作, 一般的型別轉換不只會更換資料型別, 更會使資料內容有所變動, 例如:

float fVar = 1.2;
int32_t iVar;

iVar = fVar; // iVar 值為整數 1


MagicJackTing 發表在 痞客邦 留言(1) 人氣()

'型別轉換': 基本上就只是在變數/函數前面加一對小括號, 中間填入要轉成什麼型別, 像這個樣子 "(型別)", 例如:
(unsigned char *)ptr
看不出哪一點難, 對吧
不過在實際運用上, 經常會有其他運算元的干擾, 使我們不容易看出式子的意義, 因此我自己寫了二個 macro, 使用上還算方便清楚.

MagicJackTing 發表在 痞客邦 留言(0) 人氣()

1 2
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。