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

Cocos2d-x 開發必備 C 語言核心知識速查:宏、結構體、函數指針、文件操作

     編輯:關於C語言

Cocos2d-x 底層由 C++ 編寫,但大量引擎 API、第三方庫、跨平台適配層仍保留 C 風格接口。掌握以下 C 核心知識點,能讓你輕松閱讀源碼、編寫高性能邏輯、排查 JNI/NDK 崩潰。

1. 宏定義:常量與類函數宏

// 常量宏:編譯期替換,無類型安全
#define MATH_PI 3.1415926f

// 類函數宏:參數不求值、無類型檢查、副作用風險
#define MAX(A,B) ((A) > (B) ? (A) : (B))

// 多行宏:反斜槓換行,末尾無分號
#define SAFE_FREE(p) do { \
    if (p) { free(p); (p) = NULL; } \
} while(0)

// 字符串化與連接
#define STR(x) #x
#define CONCAT(a,b) a##b

最佳實踐:常量優先 const/enum;簡單函數優先 static inline;宏名全大寫,參數加括號。

2. 結構體:定義、指針、動態分配

// 定義 + typedef 一體化
typedef struct {
    int age;
    char *name;
} Person;

// 指針分配
Person *p = malloc(sizeof(Person));
if (p) {
    p->age = 20;
    p->name = strdup("Alice");
    // 使用完畢
    free(p->name);
    free(p);
    p = NULL;
}

3. 函數指針:回調、狀態機、插件架構

// 聲明類型
typedef int (*Callback)(int event, void *ctx);

// 實現
int on_click(int evt, void *ctx) { printf("clicked\n"); return 0; }

// 註冊與調用
Callback cb = on_click;
cb(EVENT_CLICK, NULL);  // 間接調用

4. typedef 綜合應用

// 結構體別名
typedef struct Vec2 { float x, y; } Vec2;

// 函數指針別名
typedef void (*UpdateFunc)(float dt);

// 指針層級別名
typedef Vec2 *PVec2;
typedef PVec2 *PPVec2;

5. 模塊化:頭文件護衛與分離編譯

// math.h
#ifndef MATH_H
#define MATH_H
int add(int a, int b);
#endif

// math.c
#include "math.h"
int add(int a, int b) { return a + b; }

// main.c
#include "math.h"
int main() { return add(1,2); }

6. 文件操作:二進制讀寫、定位

// 讀取整個文件到內存
char *read_file(const char *path, size_t *out_len) {
    FILE *fp = fopen(path, "rb");
    if (!fp) return NULL;
    fseek(fp, 0, SEEK_END);
    long sz = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char *buf = malloc(sz + 1);
    fread(buf, 1, sz, fp);
    buf[sz] = '\0';
    fclose(fp);
    if (out_len) *out_len = sz;
    return buf;
}

// 寫入
bool write_file(const char *path, const void *data, size_t len) {
    FILE *fp = fopen(path, "wb");
    if (!fp) return false;
    bool ok = fwrite(data, 1, len, fp) == len;
    fclose(fp);
    return ok;
}

7. 實用片段:隨機數、字符串格式化、標準輸入

// 隨機數
srand((unsigned)time(NULL));
int r = rand();  // 0 ~ RAND_MAX

// 格式化到緩衝區
char buf[256];
snprintf(buf, sizeof(buf), "Score: %d, Rate: %.2f", 100, 3.14);

// 安全輸入
int val;
if (scanf("%d", &val) == 1) { /* 成功 */ }

// 獲取一行 (含空格)
char line[1024];
fgets(line, sizeof(line), stdin);
line[strcspn(line, "\n")] = '\0';

Cocos2d-x 實戰提示

  • CC_SYNTHESIZE、CC_PROPERTY 宏本質是展開 getter/setter + 成員變量。
  • 引擎內部大量使用 struct + 函數指針 實現 C 風格多態 (如 CCTexture2D 虛表)。
  • JNI 層傳遞 jlong 指針對應 C++ this,需 reinterpret_cast。
  • Lua/JS 綁定層 (tolua++/ScriptingCore) 將 C++ 類映射為結構體 + 函數指針表。

C 語言是系統編程的通用貨幣。在 Cocos2d-x 專案中,遇到性能熱點、C 庫互操作、Crash 堆棧只有 C 符號時,扎實的 C 功力就是你的核心競爭力。

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