__attribute__((시공자)) VC에서 동치입니까?
GCC에서 C 컨스트럭터를 사용할 수 있는 것처럼 VC에서도 C 컨스트럭터를 사용할 수 있는지 궁금합니다.
gcc 방식은 꽤 직선적입니다.__attribute__키워드, 유감스럽게도 VC는 이 키워드도 모르는 것 같은데, 저는 Win32 프로그래머가 아니기 때문에 그런 것들에 해당하는 키워드가 있는지 궁금합니다.
참고로, 이 프로그램은 C++나 C# 짝수가 아니라 C 프로그램입니다. (그 언어들에서는 그렇게 하기가 꽤 쉬웠기 때문입니다.)
아래 C 코드는 메인이 실행되기 전에 프로그램/라이브러리 로드 시간에 호출될 보이드(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( "finalize\n");
}
INITIALIZER( initialize)
{
printf( "initialize\n");
atexit( finalize);
}
int main( int argc, char** argv)
{
printf( "main\n");
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
그러나 INITIAZER(f)는 INITIAZER로 전달되는 동일한 함수 이름을 가진 2개의 다른 파일에 나타날 수 없습니다. 다음 정의는 다음을 허용합니다.
#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
언급URL : https://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc
'codememo' 카테고리의 다른 글
| 아약스는 php에서 반환 값을 얻습니까? (0) | 2023.09.15 |
|---|---|
| 게시물 유형별 카테고리 구분 (0) | 2023.09.15 |
| 이 memcpy 구현에서 누락된/최적의 것은 무엇입니까? (0) | 2023.09.15 |
| PowerShell을 사용하여 모든 서비스의 "실행 경로"를 추출하는 방법 (0) | 2023.09.15 |
| rand() 함수 없이 난수를 생성하려면 어떻게 해야 합니까? (0) | 2023.09.15 |