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

时间:2017-06-15 05:59:39

标签: 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 /的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()'

解决此问题的显而易见的方法是摆脱main()中的MY.cpp,但这样做会给我第一个关于返回1退出状态的错误(甚至不知道是什么这意味着)。

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

1 个答案:

答案 0 :(得分:2)

#include "MY.cpp"

立即出现红旗。您应该只#include头文件,而不是cpp文件。 #include指令插入在其位置指定的整个文件的副本。这意味着如果项目#include中的多个源文件具有相同的cpp文件,则该文件中定义的任何内容都将被多次定义,并且会违反One Definition Rule

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

gcc main.cpp MY.cpp -o MY.exe

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

这听起来像是一个Windows问题,所以也可能是您在预期main时定义WinMain。请参阅此问题以获取相关帮助:Replacing WinMain() with main() function in Win32 programs