跨平台專案需在特定記憶體區段 (Section) 定義共享變數 (如進程間共享、啟動器傳遞參數)。MSVC 與 GCC/Clang 語法截然不同:
#pragma comment(linker, "/SECTION:.shared,RWS") // 告訴連結器 .shared 區段可讀寫共享
#pragma data_seg(".shared") // 後續變數配置至 .shared 區段
int g_iShared = 0x37;
#pragma data_seg() // 恢復預設區段
/SECTION:.shared,RWS:Read/Write/Shared 屬性,實現多進程映射同一實體記憶體。#pragma data_seg 控制編譯器輸出 COFF 區段。
int g_iShared __attribute__((section(".shared"))) = 0x37;
.shared 區段屬性 (RWS) 或編譯選項 -Wl,--section-start=.shared=0xADDRESS,--section-flags=.shared=RWS。
#if defined(_MSC_VER)
#define SHARED_VAR(type, name, init) \
__pragma(comment(linker, "/SECTION:.shared,RWS")) \
__pragma(data_seg(".shared")) \
type name = init; \
__pragma(data_seg())
#elif defined(__GNUC__)
#define SHARED_VAR(type, name, init) \
type name __attribute__((section(".shared"))) = init;
#else
#define SHARED_VAR(type, name, init) type name = init;
#endif
// 使用
SHARED_VAR(int, g_iShared, 0x37)
#include
int main() {
g_iShared = 200;
int iLocal = 300;
printf("%d, 0x%p\n", g_iShared, &g_iShared);
printf("%d, 0x%p\n", iLocal, &iLocal);
return 0;
}
多次啟動程式觀察 g_iShared 位址與值是否同步 (需連結器正確設定共享屬性)。
MSVC 用 #pragma data_seg + 連結器指令,GCC 用 __attribute__((section)) + 連結器腳本。巨集封裝可單一原始碼跨平台編譯。完整測試專案 (VC6/GCC Makefile) 請下載附件。