如何在VC中输入main()例程之前执行一些代码?

我正在阅读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 = %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适用于80×86
版权所有(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

删除警告消息需要采取哪些纠正措施?

提前致谢.

添加:

我已修改代码并将类型设为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 = %d\n",z);
    printf("End!\n");
    return 0;
}

解决方法

有一些信息 here(搜索CRT).变量pinit的意义是none,它只是放在可执行文件中的一段数据,运行时可以在其中找到它.但是,我建议你给它一个类型,如下所示:
_CRTALLOC(".CRT$XIC") static void (*pinit)()=...

链接器警告可能只是警告您有一个具有int返回类型的函数,但不返回任何内容(可能您最好将返回类型更改为void).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...