我想知道是否可以在 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/1113409/