VC中的__attribute __((构造函数))等效?

我想知道是否可以在VC中使用C构造函数,因为它可以在GCC中使用它们。 使用attribute关键字的gcc方式非常简单,不幸的是VC似乎甚至不知道这个关键字,因为我不是Win32程序员,我想知道是否有某种等效的关键字用于这类事情。 需要注意的是 - 这是一个C程序,而不是C ++或C#甚至,(因为'在这些语言中很容易做到这一点) 有人知道吗? 提前致谢。     
已邀请:
下面的C代码演示了如何定义在main执行之前在程序/库加载时调用的void(void)函数。 对于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( "finalizen");
}

INITIALIZER( initialize)
{
    printf( "initializen");
    atexit( finalize);
}

int main( int argc, char** argv)
{
    printf( "mainn");
    return 0;
}
    
你可能对DllMain感兴趣。     
我认为没有办法避免在MSVC中使用C ++功能。 (无论如何,MSVC的C支持很糟糕。) 未经测试,但至少应该允许相同的代码在MSVC和GCC中工作。
#if defined(_MSC_VER)
struct construct { construct(void (*f)(void)) { f(); } };
#define constructor(fn) 
    void fn(void); static constructor constructor_##fn(fn)
#elif defined(__GNUC__)
#define constructor(fn)
    void fn(void) __attribute__((constructor))
#endif

static constructor(foo);
void foo() {
    ...
}
    
我在MSVC中尝试过最后一个答案
#ifdef _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
但INITIALIZER(f)不能出现在2个不同的文件中,并且相同的函数名称传递给INITIALIZER,以下定义将允许
#ifdef _MSC_VER
#define INITIALIZER(f) 
    static void f();
    static int __f1(){f();return 0;}
    __pragma(data_seg(".CRT$XIU"))
    static int(*__f2) () = __f1;
    __pragma(data_seg())
    static void f()
#else
#define INITIALIZER(f) 
    __attribute__((constructor)) static void f()
#endif
    

要回复问题请先登录注册