Je lis le code source CRT de Microsoft, et je peux trouver le code suivant, où la fonction __initstdio1 sera exécutée avant la routine main().Comment exécuter du code avant d'entrer la routine main() dans VC?
La question est, comment exécuter du code avant d'entrer la routine main() dans VC (code 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;
}
La sortie sera:
Some code before main!
z = 10
End!
Cependant, je ne suis pas en mesure de comprendre le code.
J'ai fait du google sur .CRT $ XIC mais pas de chance. Est-ce qu'un expert peut m'expliquer le segment de code ci-dessus, en particulier les suivants:
- Que signifie cette ligne
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
? Quelle est la signification de la variable pinit? - Lors de la compilation du compilateur (cl.exe) émet un avertissement en disant comme ci-dessous:
Microsoft (R) 32 bits C/C++ Optimisation du compilateur Version 15.00.30729.01 pour 80x86 Copyright (C) Microsoft Corporation . Tous les droits sont réservés.
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
Quelle est l'action corrective à effectuer pour supprimer le message d'avertissement?
Merci d'avance.
Ajouté:
J'ai modifié le code et donner le type à pinit comme _PIFV. Maintenant, le message d'avertissement est parti.
Le nouveau code est le suivant:
#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;
}
C'est une bonne idée. Mais votre code peut passer la compilation en C++ seulement; pas en C. – yinyueyouge
La question est étiquetée C++ – mouviciel