vc++一个工程里面为什么不能有两个main函数呢

时间:2022-09-04 17:23:31
问题如题:vc++一个工程里面为什么不能有两个main函数呢?请高手指教1

43 个解决方案

#1


入口函数呢

#2


这个就跟你不能有两个结婚证一样,呵呵
入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

#3


引用 2 楼 feilinhe 的回复:
这个就跟你不能有两个结婚证一样,呵呵
 入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

呵呵,UP

#4


引用 2 楼 feilinhe 的回复:
这个就跟你不能有两个结婚证一样,呵呵
入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

两个结婚证并不可怕,可怕的是两个main函数

#5


两个入口函数,编译器不知道从哪个开始

#6


这个一直也不明白。。。

#7


事实上,只要两个函数原型相同,都是通不过编译的,不仅仅是main函数了

#8


人为什么不能有两张嘴?

#9


一个函数有且只有一个入口点  这个入口点就是main()方法   就像一个人只有一张嘴巴一样

#10


引用 4 楼 huqinglu123 的回复:
引用 2 楼 feilinhe 的回复:
这个就跟你不能有两个结婚证一样,呵呵
入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

两个结婚证并不可怕,可怕的是两个main函数

此君可以立案调查啦,呵呵

#11


首先不能有两个同名的函数。

#12


恩, 强....

#13


同名当然可以,只有函数原型不一样
main是特殊的,多个导致无法定位起点,因此不允许
引用 11 楼 jennyvenus 的回复:
首先不能有两个同名的函数。

#14


引用 13 楼 arong1234 的回复:
同名当然可以,只有函数原型不一样
main是特殊的,多个导致无法定位起点,因此不允许
引用 11 楼 jennyvenus 的回复:
首先不能有两个同名的函数。

那倒是,本质上名称也是不同的。

#15


高级语言本身就是用来掩盖这种“本质”的,否则重载本质也不是同名函数了:)
有时从这种底层具体实现的角度来思考高级语言,就背离了高级语言的初衷了。
引用 14 楼 jennyvenus 的回复:
引用 13 楼 arong1234 的回复:
同名当然可以,只有函数原型不一样
main是特殊的,多个导致无法定位起点,因此不允许
引用 11 楼 jennyvenus 的回复:
首先不能有两个同名的函数。



那倒是,本质上名称也是不同的。

#16


语言级上C++全局对象的构造函数才是入口点.
保留main一为兼容C, 二为简化语言模型.

定义多个main在技术上没问题, 大不了多main"并发"执行, 
不过这种模型要比单1入口点复杂的多, 明显费力不讨好.
况且多进程多线程不得哭死......

#17


你说什么呢?这怎么并发得起来!!!接入点必须时唯一得。系统在链接得时候需要找一个叫main得函数,如果你有两个main,链接器直接就不知道哪个是正确得,当然必须失败
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.
保留main一为兼容C, 二为简化语言模型.

定义多个main在技术上没问题, 大不了多main"并发"执行,
不过这种模型要比单1入口点复杂的多, 明显费力不讨好.
况且多进程多线程不得哭死......

#18


引用 17 楼 arong1234 的回复:
你说什么呢?这怎么并发得起来!!!接入点必须时唯一得。系统在链接得时候需要找一个叫main得函数,如果你有两个main,链接器直接就不知道哪个是正确得,当然必须失败
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.
保留main一为兼容C, 二为简化语言模型.

定义多个main在技术上没问题, 大不了多main"并发"执行,
不过这种模型要比单1入口点复杂的多, 明显费力不讨好.
况且多进程多线程不得哭死......


2星果然不同凡响, 理解能力很强大, 呵呵.

#19


其实可以这样理解:
所谓的入口函数,从OS的角度来说就是主线程的启动地址,进程是不活泼的,它是线程的容器,一个进程只能够允许有一个主线程。如果你有两个main,也就是OS会启动两个进程,这是与上面的概念冲突的,所以不允许的。

#20


引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。

#21


你用的应该是win32控制台应用程序,一个主程序应该是由一个main函数开始,开始对各种资源配置,如果有多个main函数的话,可能对资源进行掠夺,导致死锁,导致程序无法进行,可能死机,各种函数可能都在空等。
如果你做的是MFC【exe】应用程序,系统会自动生成一些结构,这个main函数不可见,因为他是面向对象开发的,以对话框为基础,出现了很多资源比如Bitmap、Icon等等,c++有自己的方法调用,比如消息循环,这就发展到类的范围,就比较像现在的windows界面啦。了解消息循环,一些Windows程序的运行机制,你将感觉c++是一个很大的东西,这种机制十分复杂,但确实很有逻辑性。

#22


引用 20 楼 buf1024 的回复:
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。


你搞错了, CRT调用的main, 构造函数也是CRT执行的, 这明显是进程产生并运行后发生的.
所以我特别指出了"语言级", 防止把非标准的东西撤近来.

#23


两个个Main就像你前面有两条路,你只能选一条,你就麻烦了。

#24


学习了   没想到一个简单的问题引出了这么对值得思考的地方  UP~

#25


两方面:
1.程序启动,操作系统分配一个进程空间,同时在该进程中创建一个主线程

2.操作系统初始化C运行时函数库,后者随即寻找main函数执行该主线程

问题来了:初始化时只有一个线程空间,即只能执行一个main
         现在出现两个main,到底进入哪一个呢?这是个问题

我认为这是操作系统的设计产生的,即先有线程而后执行函数,若先检查main的数量再动态分配线程
可能会实现lz的设想。

#26


一个主程序只能有一个main函数

#27


不光只能有一个main啊,任何同名的函数,都不行.

#28


强制性的
这种东西只需记住
想改变
得开发个另类点的操作系统了

#29


一个简单的问题就引起这么多讨论,呵呵,学习了。

#30


本来想说两句的,但这么多高人,无语//    学习……

#31


你在哪见过有写两个main()函数得?

#32


何止是VC,像JAVA、C#,那种语言允许有两个main

#33


膜拜LZ一下……

#34


名字都叫主函数吗,一个单位能有两个正的领导吗?

#35


引用 22 楼 i_nbfa 的回复:
引用 20 楼 buf1024 的回复:
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。


你搞错了, CRT调用的main, 构造函数也是CRT执行的, 这明显是进程产生并运行后发生的.
所以我特别指出了"语言级", 防止把非标准的东西撤近来.

请参阅《Windows 核心编程》第四章.

#36


从操作系统的角度,main并不是程序的入口,而是一个“回调函数”的概念。

#37


引用 35 楼 buf1024 的回复:
引用 22 楼 i_nbfa 的回复:
引用 20 楼 buf1024 的回复:
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。


你搞错了, CRT调用的main, 构造函数也是CRT执行的, 这明显是进程产生并运行后发生的.
所以我特别指出了"语言级", 防止把非标准的东西撤近来.

请参阅《Windows 核心编程》第四章.


参阅什么? 你如果真的认真读过核心编程就不会让我去参阅什么了.

The operating system doesn't actually call the entry-point function you write. Instead, it calls a C/C++ run-time startup function implemented by the C/C++ run time and set at link time with the -entry: command-line option. This function initializes the C/C++ run-time library so that you can call functions such as malloc and free.  It also ensures that any global and static C++ objects that you have declared are constructed properly before your code executes. Table 4-1 tells you which entry point to implement in your source code and when.

.
.
.
The linker is responsible for choosing the proper C/C++ run-time startup function when it links your executable. If the /SUBSYSTEM:WINDOWS linker switch is specified, the linker expects to find either a WinMain or wWinMain function. If neither of these functions is present, the linker returns an "unresolved external symbol" error; otherwise, it chooses to call either the WinMainCRTStartup or wWinMainCRTStartup function, respectively.

不用我多做解释了吧.

#38


从MAIN开始的。如果再来一个,就乱了。。

#39


哦..原来是这样咯 刚刚入手

#40


不仅仅是main,同一个工程中,任何一个函数都不能定义两次,除非是重载,或者在不同的名字空间中,或者具有不同的linkage。

#41


真是感谢大家的回复了,没想到一个简单的问题引发大家的深入讨论,牛人真是多啊。不断学习中。。。。。。

#42


说的简单点,因为不是每一个源文件分别编译出一个exe文件,而是一个工程中的所有源文件编译完后链接在一起生成一个以工程名为名字的exe文件,你到可执行文件的文件下下看看其实一个工程只有一个可执行文件,执行其中一个源文件实际上整个工程都在执行,所以不能有两个main函数。

#43


 的确有这种情况,而且编译也不会出问题.不知道为什么

#1


入口函数呢

#2


这个就跟你不能有两个结婚证一样,呵呵
入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

#3


引用 2 楼 feilinhe 的回复:
这个就跟你不能有两个结婚证一样,呵呵
 入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

呵呵,UP

#4


引用 2 楼 feilinhe 的回复:
这个就跟你不能有两个结婚证一样,呵呵
入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

两个结婚证并不可怕,可怕的是两个main函数

#5


两个入口函数,编译器不知道从哪个开始

#6


这个一直也不明白。。。

#7


事实上,只要两个函数原型相同,都是通不过编译的,不仅仅是main函数了

#8


人为什么不能有两张嘴?

#9


一个函数有且只有一个入口点  这个入口点就是main()方法   就像一个人只有一张嘴巴一样

#10


引用 4 楼 huqinglu123 的回复:
引用 2 楼 feilinhe 的回复:
这个就跟你不能有两个结婚证一样,呵呵
入口函数有两个的话,你让程序怎么去执行,应该从哪开始执行?

两个结婚证并不可怕,可怕的是两个main函数

此君可以立案调查啦,呵呵

#11


首先不能有两个同名的函数。

#12


恩, 强....

#13


同名当然可以,只有函数原型不一样
main是特殊的,多个导致无法定位起点,因此不允许
引用 11 楼 jennyvenus 的回复:
首先不能有两个同名的函数。

#14


引用 13 楼 arong1234 的回复:
同名当然可以,只有函数原型不一样
main是特殊的,多个导致无法定位起点,因此不允许
引用 11 楼 jennyvenus 的回复:
首先不能有两个同名的函数。

那倒是,本质上名称也是不同的。

#15


高级语言本身就是用来掩盖这种“本质”的,否则重载本质也不是同名函数了:)
有时从这种底层具体实现的角度来思考高级语言,就背离了高级语言的初衷了。
引用 14 楼 jennyvenus 的回复:
引用 13 楼 arong1234 的回复:
同名当然可以,只有函数原型不一样
main是特殊的,多个导致无法定位起点,因此不允许
引用 11 楼 jennyvenus 的回复:
首先不能有两个同名的函数。



那倒是,本质上名称也是不同的。

#16


语言级上C++全局对象的构造函数才是入口点.
保留main一为兼容C, 二为简化语言模型.

定义多个main在技术上没问题, 大不了多main"并发"执行, 
不过这种模型要比单1入口点复杂的多, 明显费力不讨好.
况且多进程多线程不得哭死......

#17


你说什么呢?这怎么并发得起来!!!接入点必须时唯一得。系统在链接得时候需要找一个叫main得函数,如果你有两个main,链接器直接就不知道哪个是正确得,当然必须失败
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.
保留main一为兼容C, 二为简化语言模型.

定义多个main在技术上没问题, 大不了多main"并发"执行,
不过这种模型要比单1入口点复杂的多, 明显费力不讨好.
况且多进程多线程不得哭死......

#18


引用 17 楼 arong1234 的回复:
你说什么呢?这怎么并发得起来!!!接入点必须时唯一得。系统在链接得时候需要找一个叫main得函数,如果你有两个main,链接器直接就不知道哪个是正确得,当然必须失败
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.
保留main一为兼容C, 二为简化语言模型.

定义多个main在技术上没问题, 大不了多main"并发"执行,
不过这种模型要比单1入口点复杂的多, 明显费力不讨好.
况且多进程多线程不得哭死......


2星果然不同凡响, 理解能力很强大, 呵呵.

#19


其实可以这样理解:
所谓的入口函数,从OS的角度来说就是主线程的启动地址,进程是不活泼的,它是线程的容器,一个进程只能够允许有一个主线程。如果你有两个main,也就是OS会启动两个进程,这是与上面的概念冲突的,所以不允许的。

#20


引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。

#21


你用的应该是win32控制台应用程序,一个主程序应该是由一个main函数开始,开始对各种资源配置,如果有多个main函数的话,可能对资源进行掠夺,导致死锁,导致程序无法进行,可能死机,各种函数可能都在空等。
如果你做的是MFC【exe】应用程序,系统会自动生成一些结构,这个main函数不可见,因为他是面向对象开发的,以对话框为基础,出现了很多资源比如Bitmap、Icon等等,c++有自己的方法调用,比如消息循环,这就发展到类的范围,就比较像现在的windows界面啦。了解消息循环,一些Windows程序的运行机制,你将感觉c++是一个很大的东西,这种机制十分复杂,但确实很有逻辑性。

#22


引用 20 楼 buf1024 的回复:
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。


你搞错了, CRT调用的main, 构造函数也是CRT执行的, 这明显是进程产生并运行后发生的.
所以我特别指出了"语言级", 防止把非标准的东西撤近来.

#23


两个个Main就像你前面有两条路,你只能选一条,你就麻烦了。

#24


学习了   没想到一个简单的问题引出了这么对值得思考的地方  UP~

#25


两方面:
1.程序启动,操作系统分配一个进程空间,同时在该进程中创建一个主线程

2.操作系统初始化C运行时函数库,后者随即寻找main函数执行该主线程

问题来了:初始化时只有一个线程空间,即只能执行一个main
         现在出现两个main,到底进入哪一个呢?这是个问题

我认为这是操作系统的设计产生的,即先有线程而后执行函数,若先检查main的数量再动态分配线程
可能会实现lz的设想。

#26


一个主程序只能有一个main函数

#27


不光只能有一个main啊,任何同名的函数,都不行.

#28


强制性的
这种东西只需记住
想改变
得开发个另类点的操作系统了

#29


一个简单的问题就引起这么多讨论,呵呵,学习了。

#30


本来想说两句的,但这么多高人,无语//    学习……

#31


你在哪见过有写两个main()函数得?

#32


何止是VC,像JAVA、C#,那种语言允许有两个main

#33


膜拜LZ一下……

#34


名字都叫主函数吗,一个单位能有两个正的领导吗?

#35


引用 22 楼 i_nbfa 的回复:
引用 20 楼 buf1024 的回复:
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。


你搞错了, CRT调用的main, 构造函数也是CRT执行的, 这明显是进程产生并运行后发生的.
所以我特别指出了"语言级", 防止把非标准的东西撤近来.

请参阅《Windows 核心编程》第四章.

#36


从操作系统的角度,main并不是程序的入口,而是一个“回调函数”的概念。

#37


引用 35 楼 buf1024 的回复:
引用 22 楼 i_nbfa 的回复:
引用 20 楼 buf1024 的回复:
引用 16 楼 i_nbfa 的回复:
语言级上C++全局对象的构造函数才是入口点.

上面是不正确的。

在main启动时,OS会为所有全局和静态C++类对象调用构造函数,但主线程的入口是main。


你搞错了, CRT调用的main, 构造函数也是CRT执行的, 这明显是进程产生并运行后发生的.
所以我特别指出了"语言级", 防止把非标准的东西撤近来.

请参阅《Windows 核心编程》第四章.


参阅什么? 你如果真的认真读过核心编程就不会让我去参阅什么了.

The operating system doesn't actually call the entry-point function you write. Instead, it calls a C/C++ run-time startup function implemented by the C/C++ run time and set at link time with the -entry: command-line option. This function initializes the C/C++ run-time library so that you can call functions such as malloc and free.  It also ensures that any global and static C++ objects that you have declared are constructed properly before your code executes. Table 4-1 tells you which entry point to implement in your source code and when.

.
.
.
The linker is responsible for choosing the proper C/C++ run-time startup function when it links your executable. If the /SUBSYSTEM:WINDOWS linker switch is specified, the linker expects to find either a WinMain or wWinMain function. If neither of these functions is present, the linker returns an "unresolved external symbol" error; otherwise, it chooses to call either the WinMainCRTStartup or wWinMainCRTStartup function, respectively.

不用我多做解释了吧.

#38


从MAIN开始的。如果再来一个,就乱了。。

#39


哦..原来是这样咯 刚刚入手

#40


不仅仅是main,同一个工程中,任何一个函数都不能定义两次,除非是重载,或者在不同的名字空间中,或者具有不同的linkage。

#41


真是感谢大家的回复了,没想到一个简单的问题引发大家的深入讨论,牛人真是多啊。不断学习中。。。。。。

#42


说的简单点,因为不是每一个源文件分别编译出一个exe文件,而是一个工程中的所有源文件编译完后链接在一起生成一个以工程名为名字的exe文件,你到可执行文件的文件下下看看其实一个工程只有一个可执行文件,执行其中一个源文件实际上整个工程都在执行,所以不能有两个main函数。

#43


 的确有这种情况,而且编译也不会出问题.不知道为什么