巨集表示式與汗水的對比
一些你應該知道的強大的內建巨集
-> 例如: #define log(s) printf(「%s : %d %s 「,file,line, s);
條件編譯
-> 如何避免嵌入相同的檔案呢? 範例:
#ifndef _global_h
#define _global_h
int global = 0;
#endif
相信上面的**, 你已經見過了, 是不是可以理解呢?
- #error與#warning、#line
- #error用於生成乙個編譯錯誤訊息,並停止編譯 -> 即程式的預處理都不會完成
- #error用於定義預處理不正確的錯誤
- #warning用於生成編譯器警告,但不會停止編譯
- #line用於強制指定新的行號和編譯檔名,並對源程式的**重新編號
- #line的本質是重定義file和line
-> 範例:
log("demo");
#ifndef command
#warning complication will be stop
#error no defined constant symbol command
#endif
#line 20 "hello.c"
log("#line 起作用了嗎?");
可以看出, #error message : message並不需要加雙引號。
在看這個指令之前,先來看一下,什麼是記憶體對齊?
不同型別的資料在記憶體中按照一定規則排列; 而不是順序的乙個接乙個排放,這就是記憶體對齊。
struct test1;
struct test2;
printf("test1's size is %d:", sizeof(struct test1)); //12
printf("test2's size is %d:", sizeof(struct test2)); //8
結果為什麼是這樣呢? 來看一下記憶體對齊的規則:
- 1,對於結構體的各成員,第乙個成員位於偏移0的位置,以後每個資料的偏移量必須是 min(#pragma pack()指定的數, 這個資料成員的自身長度)的倍數。
- 2,在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構體(或聯合)最大資料成員長度中, 比較小的呢個進行
- 3, #pragma pack 的預設值為4
-> 我們可的:
- 在對齊過程中起始偏移 : 必須是 min(#pragma pack()指定的數, 這個資料成員的自身長度)的倍數
- 最後整個結構體的大小必須是 : #pragma pack指定的數值和結構體(或聯合)最大資料成員長度中, 比較小的呢個的倍數
C 下記憶體對齊 與 對齊控制
背景 在任務中遇到了由於記憶體對齊引起的乙個double資料讀取錯誤問題,排查很久才發現偏移位址跑了4位。記憶體對齊知識整理 1 乙個對齊的例子 struct struct1 2 記憶體對齊的好處 簡單來說,是為了提高處理器對於資料的處理效率。這裡涉及乙個概念 cpu的記憶體訪問粒度。目前的訪問粒度...
結構體對齊預處理指令
方式一 n可以取以下5個數中的任意乙個 1,2,4,8,16 來自定義結構體成員的對齊方式 pragma pack n 這裡放置結構體 pragma pack 取消自定義位元組對齊方式方式二 n可以取以下5個數中的任意乙個 1,2,4,8,16 來自定義結構體成員的對齊方式 pragma pack ...
記憶體管理 預處理與結構體
1.未初始化的全域性變數 bss段 用來存放那些沒有初始化和初始化為零的全域性變數。2.初始化過的全域性變數 data 裡面存放那些初始化為非零的全域性變數。3.常量資料 rodata段 ro代表ready only,rodata就是用來存放常量資料的。在多個程序是共享的,這樣可以提高執行空間利用率...