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

共享變數在 VC 與 GCC 編譯器下的不同宣告寫法

     編輯:關於VC++

跨平台專案需在特定記憶體區段 (Section) 定義共享變數 (如進程間共享、啟動器傳遞參數)。MSVC 與 GCC/Clang 語法截然不同:

MSVC (Visual C++):#pragma 指令


#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 區段。

GCC/Clang:__attribute__((section))


int g_iShared __attribute__((section(".shared"))) = 0x37;
  • 需搭配連結器腳本 (Linker Script) 設定 .shared 區段屬性 (RWS) 或編譯選項 -Wl,--section-start=.shared=0xADDRESS,--section-flags=.shared=RWS。
  • ELF 格式無 COFF 區段概念,靈活性較高但配置較複雜。

跨平台巨集封裝


#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 位址與值是否同步 (需連結器正確設定共享屬性)。

注意事項

  • 共享區段變數**必須初始化**,未初始化變數 (BSS) 不會進入指定區段。
  • 僅適用於 **POD 類型** (Plain Old Data),非 POD (建構函式、虛函數) 行為未定義。
  • 進程間同步仍需互斥體/信號量,共享變數僅提供記憶體可見性。
  • x64 環境下 MSVC 同樣支援,GCC 需確認連結器腳本相容性。

總結

MSVC 用 #pragma data_seg + 連結器指令,GCC 用 __attribute__((section)) + 連結器腳本。巨集封裝可單一原始碼跨平台編譯。完整測試專案 (VC6/GCC Makefile) 請下載附件。

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