如何在VC中输入main()例程之前执行一些代码?
发布时间:2020-12-16 04:54:12 所属栏目:百科 来源:网络整理
导读:我正在阅读Microsoft的CRT源代码,我可以提出以下代码,其中函数__initstdio1将在main()例程之前执行. 问题是,如何在VC(而不是VC代码)中输入main()例程之前执行一些代码? #include stdio.h#pragma section(".CRT$XIC",long,read)int __cdecl __initstdio1(voi
我正在阅读Microsoft的CRT源代码,我可以提出以下代码,其中函数__initstdio1将在main()例程之前执行.
问题是,如何在VC(而不是VC代码)中输入main()例程之前执行一些代码? #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 = %dn",z); printf("End!n"); return 0; } 输出将是: Some code before main! z = 10 End! 但是,我无法理解代码. 我在.CRT $XIC上做了一些谷歌,但没有找到运气.有些专家可以向我解释上面的代码段,尤其是以下内容: >这行_CRTALLOC(“.CRT $XIC”)static pinit = __initstdio1;意思?变量pinit有什么意义? Microsoft(R)32位C/C++优化编译器版本15.00.30729.01适用于80×86 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 删除警告消息需要采取哪些纠正措施? 提前致谢. 添加: 我已修改代码并将类型设为pinit为_PIFV.现在警告消息消失了. 新代码如下: #include <stdio.h> #pragma section(".CRT$XIC1",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 = %dn",z); printf("End!n"); return 0; } 解决方法
有一些信息
here(搜索CRT).变量pinit的意义是none,它只是放在可执行文件中的一段数据,运行时可以在其中找到它.但是,我建议你给它一个类型,如下所示:
_CRTALLOC(".CRT$XIC") static void (*pinit)()=... 链接器警告可能只是警告您有一个具有int返回类型的函数,但不返回任何内容(可能您最好将返回类型更改为void). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |