Sto leggendo il codice sorgente CRT di Microsoft e posso trovare il seguente codice, in cui la funzione __initstdio1 verrà eseguita prima della routine main().Come eseguire un codice prima di accedere alla routine main() in VC?
La domanda è, come eseguire un codice prima di immettere la routine main() in VC (non il codice 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;
}
L'uscita sarà:
Some code before main!
z = 10
End!
Tuttavia, io non sono in grado di capire il codice.
Ho fatto qualche google su .CRT $ XIC ma non ho trovato fortuna. Qualche esperto può spiegarmi sopra il segmento di codice, in particolare i seguenti:
- Che cosa significa questa riga
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
? Qual è il significato della variabile pinit? - Durante la compilazione il compilatore (cl.exe) lancia un avvertimento dicendo come di seguito:
Microsoft (R) a 32 bit C/C++ compilatore di ottimizzazione Versione 15.00.30729.01 per 80x86 Copyright (C) Microsoft Corporation . Tutti i diritti riservati.
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
Qual è l'azione correttiva da eseguire per rimuovere il messaggio di avviso?
Grazie in anticipo.
Aggiunto:
Ho modificato il codice e dare il tipo di Pinit come _PIFV. Ora il messaggio di avviso è sparito.
Il nuovo codice è il seguente:
#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;
}
Questa è una buona idea. Ma il tuo codice può passare la compilazione solo in C++; non in C. – yinyueyouge
La domanda è codificata C++ – mouviciel