Tôi đang đọc mã nguồn CRT của Microsoft và tôi có thể đưa ra mã sau đây, trong đó hàm __initstdio1 sẽ được thực hiện trước chính quy trình().Làm thế nào để thực hiện một số mã trước khi nhập chính() thường xuyên trong VC?
Câu hỏi đặt ra là, làm cách nào để thực thi một số mã trước khi nhập thông thường() trong VC (không phải mã VC++)?
#include <stdio.h>
#pragma section(".CRT$XIC",long,read)
int __cdecl __initstdio1(void);
#define _CRTALLOC(x) __declspec(allocate(x))
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
int z = 1;
int __cdecl __initstdio1(void) {
z = 10;
return 0;
}
int main(void) {
printf("Some code before main!\n");
printf("z = %d\n", z);
printf("End!\n");
return 0;
}
Kết quả sẽ là:
Some code before main!
z = 10
End!
Tuy nhiên, tôi không thể hiểu được mã.
Tôi đã thực hiện một số google trên .CRT $ XIC nhưng không tìm thấy may mắn nào. Một số chuyên gia có thể giải thích đoạn mã trên cho tôi, đặc biệt là các phần sau:
- Dòng này
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
có nghĩa là gì? Ý nghĩa của biến pinit là gì? - Trong biên soạn trình biên dịch (cl.exe) ném một cảnh báo nói như sau:
Microsoft (R) 32-bit C/C++ Compiler Tối ưu hóa Version 15.00.30729.01 cho 80x86 Bản quyền (C) Microsoft Corporation . Đã đăng ký Bản quyền.
stdmacro.c
stdmacro.c(9) : warning C4047: 'initializing' : 'int' differs in levels of indirection from 'int (__
cdecl *)(void)'
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:stdmacro.exe
stdmacro.obj
Hành động sửa chữa cần phải được thực hiện để xóa thông điệp cảnh báo là gì?
Xin cảm ơn trước.
Added:
tôi đã sửa đổi mã số và cung cấp cho loại để pinit như _PIFV. Bây giờ thông điệp cảnh báo đã biến mất.
Các mã mới như sau:
#include <stdio.h>
#pragma section(".CRT$XIC1",long,read)
int __cdecl __initstdio1(void);
typedef int (__cdecl *_PIFV)(void);
#define _CRTALLOC(x) __declspec(allocate(x))
_CRTALLOC(".CRT$XIC1") static _PIFV pinit1 = __initstdio1;
int z = 1;
int __cdecl __initstdio1(void) {
z = 100;
return 0;
}
int main(void) {
printf("Some code before main!\n");
printf("z = %d\n", z);
printf("End!\n");
return 0;
}
Đây là một ý tưởng hay. Nhưng mã của bạn có thể chuyển biên dịch chỉ trong C++; không phải trong C. – yinyueyouge
Câu hỏi được gắn thẻ C++ – mouviciel