利用 GCC/Clang __attribute__((section("name"))) 將變數元資料放入自定義 ELF 區段,實現零樣板碼的變數自動註冊、配置表生成、命令列選項收集等功能。
#include <stdio.h>
struct var_tab_item {
const char *name;
const char *desc;
char type;
void *var;
};
#define SECTION(name) __attribute__((section(name)))
#define EXPORT_VAR(name, desc, type) \
const char __var_##name##_name[] = #name; \
const char __var_##name##_desc[] = #desc; \
const struct var_tab_item __var_##name SECTION("ExVar") = { \
__var_##name##_name, \
__var_##name##_desc, \
type, \
(void *)&name \
}
#define DEFINE_INT32(name, desc) \
long long name = 0xabcd; \
EXPORT_VAR(name, desc, 'i')
// 使用範例
DEFINE_INT32(test0, a test setting)
DEFINE_INT32(test1, cool tpdt)
int main() {
printf("%lld\n", test0); // 正常使用變數
// 連結器會將所有 __var_* 聚合在 ExVar 區段
// 運行時可遍歷該區段獲取所有註冊變數
return 0;
}
SECTION("ExVar") 指示連結器將結構體實例放入名為 ExVar 的自定義區段。__start_ExVar / __stop_ExVar 符號(GNU ld 自動生成)即可遍歷所有註冊項。EXPORT_VAR 自動生成名稱/描述字串字面量,避免重複輸入。| 場景 | 效果 |
|---|---|
| 配置系統 | 自動生成配置項表單、說明文檔 |
| 命令列解析 | 註冊選項、類型、預設值、幫助文字 |
| 測試框架 | 自動收集測試用例函數指標 |
| 插件系統 | 導出介面結構體自動註冊 |
__attribute__((section))。__declspec(allocate("section")),需連結器 /SECTION 設定可讀。ExVar 區段位址範圍。