C++ 如何提前终止在另一个文件中定义的函数?

C++ 如何提前终止在另一个文件中定义的函数?,c++,C++,我有一个文件,在那里我试图重载一些操作符,如果有条件,它应该提前终止。此文件与主文件分开 #include "MY.h" // this file is MY.cpp // MY is a class int& MY::operator[](int i) { if (/* condition is met */) exit(1); else {/* proceed... */} } 如果我编译它,它会给我这个错误 c:/mingw/bin/./lib/gcc/ming

我有一个文件,在那里我试图重载一些操作符,如果有条件,它应该提前终止。此文件与主文件分开

#include "MY.h"
// this file is MY.cpp
// MY is a class

int& MY::operator[](int i) {
    if (/* condition is met */) exit(1);
    else {/* proceed... */}
}
如果我编译它,它会给我这个错误

c:/mingw/bin/./lib/gcc/mingw32/5.3.0/../../../../../libmingw32.a(main.o):(.text.startup+0xa0): 未定义的引用`WinMain@16'collect2.exe:错误:ld返回1 退出状态

但假设我有一个
main()
,里面什么都没有,就像这样:

// same stuff as above code

int main() {}
带有空
main()
函数的新代码编译时不会出现任何问题

现在,我有另一个文件,我要使用的实际
main()
在这个文件中:

#include "MY.cpp"

int main() { /* some code... */}
如果我编译此文件,则会出现以下错误:

错误:“int main()的重新定义”

解决此问题的明显方法是在
MY.cpp
中删除
main()
,但这样做会导致返回的1退出状态的第一个错误(甚至不知道这意味着什么)

**所以底线是:如果一个函数是在我的主文件中包含的另一个文件中定义的,那么如何终止该函数**

#include "MY.cpp"
立即发出红旗。您应该只包含头文件,而不是cpp文件。
#include
指令在指定的位置插入整个文件的副本。这意味着,如果项目中的多个源文件
#包含同一个cpp文件,则该文件中定义的任何内容都将被多次定义,并将违反该规则

在项目中使用多个源文件的方法是,将它们的头文件包含在任何源文件或头文件所需的文件中,并将所有cpp文件添加到IDE中的项目中,并让它管理这些文件的编译,或者如果从命令行运行GCC,则将它们全部指定为命令行参数。例如

gcc main.cpp MY.cpp -o MY.exe
至于您收到的错误,这表明在任何源文件中都没有定义
main
函数,如果您试图将
MY.cpp
编译为一个完整的可执行文件,而不是一个目标文件,或者使用定义主函数的单独cpp文件来编译它,这是可能的

这听起来像是Windows的问题,所以也可能是您在定义
main
时需要
WinMain
。请参阅本期,以获取以下方面的帮助:

立即发出红旗。您应该只包含头文件,而不是cpp文件。
#include
指令在指定的位置插入整个文件的副本。这意味着,如果项目中的多个源文件
#包含同一个cpp文件,则该文件中定义的任何内容都将被多次定义,并将违反该规则

在项目中使用多个源文件的方法是,将它们的头文件包含在任何源文件或头文件所需的文件中,并将所有cpp文件添加到IDE中的项目中,并让它管理这些文件的编译,或者如果从命令行运行GCC,则将它们全部指定为命令行参数。例如

gcc main.cpp MY.cpp -o MY.exe
至于您收到的错误,这表明在任何源文件中都没有定义
main
函数,如果您试图将
MY.cpp
编译为一个完整的可执行文件,而不是一个目标文件,或者使用定义主函数的单独cpp文件来编译它,这是可能的


这听起来像是Windows的问题,所以也可能是您在定义
main
时需要
WinMain
。查看此问题以获取帮助:

这是一个链接器错误,似乎您没有很好地配置IDE…第一个错误来自这样一个事实,即您试图编译第一个文件,好像它是一个完整的程序,因此它正确地抱怨没有
main
。要点不是提供一个
-main
,而是将其与其他文件一起编译-要么在命令行上指定所有cpp文件,要么将它们单独编译为对象文件(使用
-c
选项),并在最后将它们链接在一起。通常IDE会为您处理所有这些-只需将文件添加到项目中即可。最重要的是,您不包括cpp文件—您只包括标题。Visual Studio允许您在获得控制台窗口并使用
main
的控制台应用程序和在没有控制台的情况下启动并使用
WinMain
的窗口应用程序之间进行选择。您似乎想要一个控制台应用程序,但选择了一个窗口应用程序。你可以在项目设置中的某个地方解决这个问题。@MatteoItalia,谢谢你的回答,但是我如何使我在my.cpp文件中定义的所有内容在第二个.cpp文件中可见,我在第二个.cpp文件中包括了“my.cpp”?你将声明放在
.h
中,将定义放在
.cpp
中,然后你将
.h
包括在内。看,这是一个链接器错误,似乎您没有很好地配置IDE…第一个错误来自这样一个事实:您试图编译第一个文件,好像它是一个完整的程序,因此它正确地抱怨没有
main
。要点不是提供一个
-main
,而是将其与其他文件一起编译-要么在命令行上指定所有cpp文件,要么将它们单独编译为对象文件(使用
-c
选项),并在最后将它们链接在一起。通常IDE会为您处理所有这些-只需将文件添加到项目中即可。最重要的是,您不包括cpp文件—您只包括标题。Visual Studio允许您在获得控制台窗口并使用
main
的控制台应用程序和在没有控制台的情况下启动并使用
WinMain
的窗口应用程序之间进行选择。您似乎想要一个控制台应用程序,但选择了一个窗口应用程序。您可以在“项目设置”的某个地方修复它。@MatteoItalia,谢谢您的回答,但是