C++标准中的$ 3.6.1/1节,
程序应包含一个名为main的全局函数,它是程序的指定开始.
现在考虑这段代码,
int square(int i) { return i*i; }
int user_main()
{
for ( int i = 0 ; i < 10 ; ++i )
std::cout << square(i) << endl;
return 0;
}
int main_ret= user_main();
int main()
{
return main_ret;
}
Run Code Online (Sandbox Code Playgroud)
此示例代码执行我打算执行的操作,即在进入main()应该是程序"开始" 的函数之前打印从0到9的整数平方.
我还用-pedantic选项GCC 4.5.0 编译它.它没有错误,甚至没有警告!
所以我的问题是,
这段代码真的符合标准吗?
如果它符合标准,那么它是否会使标准所说的无效?main()不是这个计划的开始!user_main()在执行之前执行main().
我知道要初始化全局变量main_ret,use_main()首先执行,但这是完全不同的事情; 关键是,它确实使标准中的引用语句$ 3.6.1/1无效,因为main() …
我想在main功能之前做一些事情.我有多个源文件.在每个文件中,有一些工作需要在之前完成main.这在C++中没有问题,但在C语言中存在问题.
在C++中,这可以通过两种方式完成:
例如, static const int __register_dummy_ = __AddRegisterMetaInfo(...);
但是,在C中,无论哪种方式都是不可能的.显然,没有构造函数.所以,第一种选择本质上是不可能的.
我认为第二个选项是可能的,但不是用C编译的(我只用Visual C++测试过.它给出了C2099.).C只允许常量为非自动变量.
有没有办法在main之前调用一些函数?
编辑:似乎很多人误解了我真正想做的事情.很抱歉以简单的方式撰写此问题.
我需要做的是实现一种C++运行时类信息功能,就像MFC的方法一样.在这种方法中,我需要从所有源代码中获取一些信息.例如,假设每个源文件都有一个类的定义,我想查看所有信息(例如,类名和父类).最简单的方法是在每个文件中放置一个静态构造函数,每个构造函数访问一个全局数据结构并注册其信息.但是,我也想找到一种方法在C中实现类似的东西.所以,简单地调用pre_main_jobin main不能成为我的答案.
请注意,这种滥用静态构造函数的方法也可以在LLVM编译器套件中找到.每个优化/分析功能都作为通过实现.所有这些传递都是通过静态构造函数注册的.