main() 的多重定义
Posted
技术标签:
【中文标题】main() 的多重定义【英文标题】:Multiple definition of main() 【发布时间】:2014-02-02 08:43:12 【问题描述】:大家好,尝试使用两个 main() 并在 main() 的多个定义中遇到此错误。我重命名了我的主要功能,那么为什么会出现这个错误,并且首先在这里为我的 print() 定义。 头文件:
#ifndef TOP_H_
#define TOP_H_
#include <stdio.h>
#include <string.h>
#define onemain main
#define twomain main
inline void print();
#endif /* TOP_H_ */
c文件一:
#include "top.h"
void print();
int onemain()
print();
return 0;
void print()
printf("hello one");
c文件二:
#include "top.h"
void print();
int twomain()
print();
return 0;
void print()
printf("hello two");
【问题讨论】:
请不要无故发布屏幕打印。更好地描述您的问题,这一点根本不清楚。你想达到什么目标? 与其拥有两个主电源,为什么不拥有两个简单的函数,int mymain1(int argc, char *argv[])
和 int mymain2(int argc, char *argv[])
。实际的main
调用任何一个合适的。
【参考方案1】:
基本上任何 C(甚至 C++)程序都是一堆相互调用的函数。
要开始执行程序,您必须选择其中一个函数并首先调用它。
按照惯例,这个初始函数称为main
。
当您在项目中包含多个源文件时,IDE 会将它们全部编译,然后调用链接器,该链接器会查找一个名为 main
的函数并生成一个可执行文件来调用它。
如果出于任何原因,您在所有这些文件中定义了两个“主”函数,链接器将警告您它无法自行选择您打算将哪个作为程序的起点。
【讨论】:
【参考方案2】:onemain
和 twomain
的宏替换发生在编译器正确看到程序之前,因此没有区别。这两个函数都命名为main
。
C++ 允许使用相同名称的不同函数,但不允许对完全相同的函数签名进行两个定义。没有办法形成会达到任一重载的函数调用表达式。另外,函数是同一个实体,一个事物不能有两个定义。
此外,在 C++ 中,main
不能重载,因为程序应该在调用唯一的 main
函数时启动,并且任何给定的系统都会检测到特定程序使用的 main
的格式,超出多种允许的格式。 (此自动检测功能也适用于 C。)
但是你问的不是C++;而是C++。在 C 语言中,如果没有函数重载,就没有相同名称的重新定义,即使对于不同的签名也是如此。 C 中extern
链接的每个名称唯一标识一个实体,因此不能有两个。
不清楚您希望生成的程序做什么。您很可能需要构建两个单独的程序。
【讨论】:
... 并且 C 也不允许它们。这与这个问题有关。 @glglgl 调整了答案。我没有注意到语言是 C……让问题变得更加奇怪。 但是我在某个地方读到了我可以重命名我的 main() 并使用它们(在 C 中也是如此),并且还不止一个像上面那样。而且我不能在头文件中声明一个函数并在我想要的任何地方使用它吗?我在这里真正想要的是我想使用两个电源(或者重命名它们)并使用在我的 c 源文件的头文件中声明的相同的打印(或其他一些)函数。 @jeevanreddymandali 宏不会完成任何重命名。它们只是一个文本替换引擎,就像智能搜索和替换一样,在程序编译之前生效。听起来您想要两个不同的程序,由 IDE 中的两个不同项目文件创建。这些单独的程序可以通过使用库来共享通用的打印功能。有关详细信息,请参阅有关库的 IDE/平台文档,或者将定义print()
(而不是 main
)的 C 文件链接到两个项目中。【参考方案3】:
我不明白你的要求 - 你的错误信息很清楚:
-
您有两个
print()
的定义,它们会发生冲突。删除一个。
您还有两个 main()
定义 - 您的 #define
s 将替换您的 onemain
和 twomain
函数,有效地将它们命名为 main
。
【讨论】:
【参考方案4】:你覆盖了内置的print
,大约main
,试着想象一辆有两个方向盘的汽车......它不会工作......
你的 C 程序有两个至少有一个main
,所以计算机知道程序从哪里开始。
如果您有 2 个文件和两个 main
函数,那么您有两个不同的程序。
【讨论】:
@Potatoswatter,是的,也许是在宝马测试场,但不是在普通街道。 @Potatoswatter - 后座司机猜一个?! 驾校广泛使用。【参考方案5】:C 程序中不可能有多个 main()。此外,main() 应声明为 int
并返回一个整数值(通常为 0)。
【讨论】:
这不是真的 - 在 C(不是 c++)中它可以是 void @EdHeal 虽然你所说的基本上是正确的,但这个答案的主要主张是好的。所以我要 +1。 @EdHeal:仅如果实现明确将其记录为合法签名。否则行为未定义。参见online 2011 standard,5.1.2.2.1,第 1 段。 void main() 可以运行,但使用 GCC 和 Clang 会发出编译器警告(我主要是 UNIX/Linux 人)。更多关于 void main() 的讨论:***.com/questions/3156423/… @John Bode ...这可能是 UNIX 与 Windows 的对比。显然,微软确实制作了main()
必须是void
的编译器(请参阅我在上面评论中链接到的讨论)。以上是关于main() 的多重定义的主要内容,如果未能解决你的问题,请参考以下文章