Cocos2d-x 底層由 C++ 編寫,但大量引擎 API、第三方庫、跨平台適配層仍保留 C 風格接口。掌握以下 C 核心知識點,能讓你輕松閱讀源碼、編寫高性能邏輯、排查 JNI/NDK 崩潰。
// 常量宏:編譯期替換,無類型安全
#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;宏名全大寫,參數加括號。
// 定義 + 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;
}
// 聲明類型
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); // 間接調用
// 結構體別名
typedef struct Vec2 { float x, y; } Vec2;
// 函數指針別名
typedef void (*UpdateFunc)(float dt);
// 指針層級別名
typedef Vec2 *PVec2;
typedef PVec2 *PPVec2;
// 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); }
// 讀取整個文件到內存
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;
}
// 隨機數
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';
CC_SYNTHESIZE、CC_PROPERTY 宏本質是展開 getter/setter + 成員變量。struct + 函數指針 實現 C 風格多態 (如 CCTexture2D 虛表)。jlong 指針對應 C++ this,需 reinterpret_cast。C 語言是系統編程的通用貨幣。在 Cocos2d-x 專案中,遇到性能熱點、C 庫互操作、Crash 堆棧只有 C 符號時,扎實的 C 功力就是你的核心競爭力。