首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 FAQ 精選:整數類型選擇、64位類型、全域變數最佳實踐

     編輯:關於C語言

1.1 如何選擇整數類型?

  • 需大數值(>32,767 或 < -32,767)→ long
  • 記憶體敏感(大陣列/結構體)→ short
  • 一般情況 → int
  • 位元操作、避免符號擴展 → 對應 unsigned 類型
  • 嚴格溢位語義 → C99 <stdint.h> 固定寬度類型(int32_t 等)

⚠️ 混用有號/無號需極謹慎,隱式轉換易導致邏輯錯誤。

1.2 64 位機器上的 64 位類型

  • C99 標準 long long 保證 ≥ 64 位
  • 部分編譯器實作 long 為 64 位(LP64 模型:Linux/macOS 64位)
  • Windows 64 位為 LLP64:long 32 位,long long 64 位
  • 可用 int64_t/uint64_t 確保可移植性

1.3 全域變數與函數最佳宣告方式

  1. 在單一 .c 檔定義(配置儲存空間、初始化)
  2. 在 .h 檔用 extern 聲明
  3. 需用的 .c 包含該 .h
  4. 定義檔也包含 .h,讓編譯器檢查一致性
// globals.h
extern int global_counter;
extern void init_system(void);

// globals.c
#include "globals.h"
int global_counter = 0;
void init_system(void) { ... }

// main.c
#include "globals.h"
int main() { init_system(); ... }

1.4 extern 在函數聲明中的意義

語法提示:定義可能在其他編譯單元。extern int f(); 與 int f(); 無實質差異,函數預設即為外部連結。

1.5 auto 關鍵字用途

已廢棄,無實際用途。C++11 賦予新意義(型別推導),C 語言無此特性。

1.6 結構體自我引用正確寫法

// 錯誤:typedef 尚未完成即使用
typedef struct { char *item; NODEPTR next; } *NODEPTR;

// 正確:先給結構體標籤
struct Node { char *item; struct Node *next; };
typedef struct Node *NodePtr;

1.7 複雜聲明理解方法

  • cdecl 工具:英文↔C 聲明互轉
  • 從內到外讀:char *(*(*a[N])())() → a 是陣列,元素為指標,指向函數,回傳指標,指向函數,回傳 char*
  • typedef 分層:逐步建立型別別名

1.8 函數未聲明先呼叫的陷阱

隱式宣告為 int f(),後續實際定義若不符合 → 編譯錯誤「非法重定義」。所有函數必須先聲明再使用。

1.9 main() 正確定義

  1. 上一篇文章:
  2. 下一篇文章:
欄目導航
Copyright © 程式碼之家 All Rights Reserved