main()的多重定义

时间:2014-02-02 08:43:13

标签: c main multiple-definition-error

嗨,大家好试着使用两个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 file one:

#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");
}

Error snapshot

5 个答案:

答案 0 :(得分:10)

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

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

如果由于任何原因,您在所有这些文件中定义了两个“主要”函数,链接器将警告您它无法自行选择您希望作为程序起点的那个。

答案 1 :(得分:4)

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

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

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

但你不是在问C ++;在C中,没有函数重载,即使对于不同的签名,也没有相同名称的重新定义。 C中{{1}}个链接的每个名称唯一标识一个实体,因此不能有两个。

目前还不清楚你想要的结果程序是做什么的。很可能你需要建立两个独立的程序。

答案 2 :(得分:3)

我不明白你的问题 - 你的错误信息很清楚:

  1. 您有print()的2个定义,它们会发生碰撞。删除一个。
  2. 您还有main()的2个定义 - 您的#define将替换您的onemaintwomain函数,并将其有效地命名为main。< / LI>

答案 3 :(得分:0)

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

您的C程序有两个至少有一个main,因此计算机知道程序的起始位置。 如果您有2个具有两个main功能的文件,那么您有两个不同的程序。

答案 4 :(得分:0)

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