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

标签 c visual-studio

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

相关文章:

c - 如何用 C 语言从文本文件中剪切或截断行

asp.net - 使用 .NET Core ASP.NET Web 应用程序将 Excel 文件导入到 SQL Server 数据库

c++ - 在单独的项目中调试多个相关的 dll

c++ - 是什么导致 MS Visual Studio 无法识别构建错误?

c - GNU C 库的源代码在哪里?

c - 代码中的内存错误和可能的解决方案

asp.net-mvc - 如何在 Visual Studio 2012 或 Visual Studio 2013 中打开旧的 MVC 项目?

visual-studio - ReSharper--对其他人不稳定?

c - printf 中的三元运算符

c++ - 这是在字符串为空时执行 strcmp 以返回 false 的好方法吗