Я читаю исходный код Microsoft CRT и могу придумать следующий код, в котором функция __initstdio1 будет выполняться перед подпрограммой main().
Вопрос в том, как выполнить некоторый код перед входом в процедуру main() в VC (не код 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;
}
Вывод будет:
Some code before main!
z = 10
End!
Однако я не могу понять код.
Я немного погуглил по .CRT$XIC, но ничего не вышло. Может ли какой-нибудь эксперт объяснить мне приведенный выше сегмент кода, особенно следующее:
- Что означает эта строка
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
? Каково значение переменной pinit? - Во время компиляции компилятор (cl.exe) выдает предупреждение, как показано ниже:
Microsoft (R) 32-разрядный оптимизирующий компилятор C/C++ Версия 15.00.30729.01 для 80x86 Copyright (C) Microsoft Corporation. Все права защищены.
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
Какие корректирующие действия необходимо выполнить, чтобы удалить предупреждающее сообщение?
Заранее спасибо.
Добавлен:
Я изменил код и задал тип для ввода как _PIFV. Теперь предупреждающее сообщение исчезло.
Новый код выглядит следующим образом:
#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;
}