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

C語言在 main 前/後執行函數:GCC attribute 與 MSVC #pragma 方案

     編輯:關於C語言

GCC/Clang:attribute

[cpp]
#include 

__attribute__((constructor)) void before_main() {
    printf("%s\n", __FUNCTION__);
}
__attribute__((destructor)) void after_main() {
    printf("%s\n", __FUNCTION__);
}

int main(int argc, char **argv) {
    printf("%s\n", __FUNCTION__);
    return 0;
}

輸出:before_main → main → after_main。可定義多個 constructor/destructor,按優先級順序執行。

MSVC:#pragma data_seg

[cpp]
#include 

int before_main() { printf("%s\n", __FUNCTION__); return 0; }
int after_main()  { printf("%s\n", __FUNCTION__); return 0; }

typedef int (*func)();
#pragma data_seg(".CRT$XIU")
static func *before[] = { before_main };
#pragma data_seg(".CRT$XPU")
static func *after[]  = { after_main };
#pragma data_seg()

int main(int argc, char **argv) {
    printf("%s\n", __FUNCTION__);
    return 0;
}

利用 CRT 初始化節區 .CRT$XIU (初始化) 和 .CRT$XPU (終止) 注冊函數指針。

應用場景

  • 全局對象構造/析構(C++ 自動用此機制)。
  • 日誌系統初始化/刷新、內存檢測掛鉤、插件自動註冊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved