gpt4 book ai didi

c - __attribute__((constructor)) 在 VC 中等效?

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:46 25 4
gpt4 key购买 nike

我想知道是否可以在 VC 中使用 C 构造函数,就像在 GCC 中使用它们一样。
gcc 方法使用 __attribute__ 关键字非常直接,不幸的是 VC 似乎甚至不知道这个关键字,因为我不是 Win32 程序员我想知道是否有某种等效的关键字用于此类事情.
请注意 - 这是一个 C 程序,甚至不是 C++ 或 C#,(因为在这些语言中很容易做到这一点)

最佳答案

下面的 C 代码演示了如何定义一个 void(void) 函数,以便在程序/库加载时、main 执行之前调用。

对于 MSVC,这会在用户初始化程序部分 (.CRT$XCU) 中放置一个指向函数的指针,基本上与编译器对静态 C++ 对象的构造函数调用所做的相同。对于 GCC,使用构造函数属性。

    // Initializer/finalizer sample for MSVC and GCC/Clang.
// 2010-2016 Joe Lowe. Released into the public domain.
#include <stdio.h>
#include <stdlib.h>

#ifdef __cplusplus
#define INITIALIZER(f) \
static void f(void); \
struct f##_t_ { f##_t_(void) { f(); } }; static f##_t_ f##_; \
static void f(void)
#elif defined(_MSC_VER)
#pragma section(".CRT$XCU",read)
#define INITIALIZER2_(f,p) \
static void f(void); \
__declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \
__pragma(comment(linker,"/include:" p #f "_")) \
static void f(void)
#ifdef _WIN64
#define INITIALIZER(f) INITIALIZER2_(f,"")
#else
#define INITIALIZER(f) INITIALIZER2_(f,"_")
#endif
#else
#define INITIALIZER(f) \
static void f(void) __attribute__((constructor)); \
static void f(void)
#endif

static void finalize(void)
{
printf( "finalize\n");
}

INITIALIZER( initialize)
{
printf( "initialize\n");
atexit( finalize);
}

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

关于c - __attribute__((constructor)) 在 VC 中等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com