1

大家好,尝试使用两个 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");
}

错误快照

4

5 回答 5

10

基本上任何 C(甚至 C++)程序都是一堆互相调用的函数。
要开始执行程序,您必须选择其中一个函数并首先调用它。
按照惯例,这个初始函数被调用main

当您在一个项目中包含多个源文件时,IDE 会将它们全部编译,然后调用链接器,该链接器会查找一个被调用的函数main并生成一个可执行文件来调用它。

如果出于任何原因,您在所有这些文件中定义了两个“主要”函数,链接器将警告您它不能自行选择您打算将哪个作为程序的起点。

于 2014-02-02T08:56:54.387 回答
3

onemain和的宏替换twomain发生在编译器正确看到程序之前,因此没有区别。这两个函数都命名为main.

C++ 允许使用相同名称的不同函数,但不允许对完全相同的函数签名进行两个定义。没有办法形成会达到任一重载的函数调用表达式。另外,功能是同一个实体,一件事不能有两个定义。

此外,在 C++main中不能重载,因为程序应该在main调用唯一函数时启动,并且任何给定的系统都会检测main特定程序使用的格式,超出各种允许的格式。(此自动检测功能也适用于 C。)

但是您不是在询问 C++;而是在询问 C++。在 C 语言中,如果没有函数重载,就没有相同名称的重新定义,即使对于不同的签名也是如此。C 中的每个extern链接名称唯一标识一个实体,因此您不能有两个。

目前尚不清楚您希望生成的程序做什么。您很可能需要构建两个单独的程序。

于 2014-02-02T08:50:24.813 回答
2

我不明白您的要求-您的错误消息很清楚:

  1. 您有 2 个定义print(),它们会发生冲突。删除一个。
  2. 您还有 2 个定义main()- 您#define的 s 将替换您的onemainandtwomain函数,将它们有效地命名为main.
于 2014-02-02T08:51:35.880 回答
0

你超越了内置的print,关于main,试着想象一辆有两个方向盘的汽车......它不会工作......

你的 C 程序至少有两个main,所以计算机知道程序从哪里开始。如果您有 2 个具有两个main功能的文件,那么您有两个不同的程序。

于 2014-02-02T08:45:21.523 回答
0

C 程序中不可能有多个 main()。此外,main() 应声明为 anint并返回一个整数值(通常为 0)。

于 2014-02-02T08:46:54.047 回答