Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器如何在C++;?_C++ - Fatal编程技术网

C++ 编译器如何在C++;?

C++ 编译器如何在C++;?,c++,C++,我有一个gtest项目a来测试我自己的代码(默认情况下,gtestmain函数是程序的入口点)。我将自己的代码编译成一个静态库,并将该库用作测试项目的输入依赖项。这里的“异常”是,在我自己的代码中还有另一个main函数 我并不想在一个程序中包含两个main()函数,但我不想将我自己的代码复制到gtest项目中来执行DT,也不想将我自己的项目分割成几个没有main()函数的小块 gtest项目的编译结果是两个主要功能都很好(一个是“链接的一个”,但实际上我不知道这是如何实现的?)。我在VS2017

我有一个gtest项目a来测试我自己的代码(默认情况下,gtest
main
函数是程序的入口点)。我将自己的代码编译成一个静态库,并将该库用作测试项目的输入依赖项。这里的“异常”是,在我自己的代码中还有另一个
main
函数

我并不想在一个程序中包含两个main()函数,但我不想将我自己的代码复制到gtest项目中来执行DT,也不想将我自己的项目分割成几个没有main()函数的小块

gtest项目的编译结果是两个主要功能都很好(一个是“链接的一个”,但实际上我不知道这是如何实现的?)。我在VS2017中将gtest项目设置为我的启动项目。当我运行程序时,VS2017自动选择我自己的
main
函数(而不是gtest main)作为程序的入口点。这种行为不符合逻辑,因为它应该启动gtest项目,因为它是“启动项目”


如果一个C++程序中有两个主要功能,编译器是如何选择最先运行哪个程序的?p> 它没有。

如果您试图生成一个具有两个相同签名和外部链接功能的可执行文件,
main
或其他功能,则链接器应该告诉您存在重复的定义,并且生成失败

我想在某些情况下(比如提供)它可能无法诊断,但这并不意味着它是正确的,结果可能是任何东西

静态(或动态)库永远不应包含
main
。单元测试并没有要求您这样做

我不想[…]将我自己的项目分割成几个没有main()函数的小块

为什么不呢?这是设计模块化软件的正常、普通、正确的方法。你遇到的这个问题只是其中一个原因


main()
是程序的入口点,而不是程序中每一项功能的触发点。在您的情况下,入口点是测试运行程序,它应该能够通过您在库中创建的相应类和函数访问您的功能。

为什么您在静态库中有自己的main()?那是一只虫子!这是一个ODR冲突->UB.@MatthieuBrucher那么您如何在自己的代码上执行UT?我必须删除自己的main()函数吗?因为我正在使用gtest。通常链接器会拒绝两个版本的
main
。为什么需要main()函数来运行单元测试?测试运行程序将有自己的main()。我同意您将main()函数与程序的其他部分分离是设计模块化软件的正确方法。我想这就是为什么一个库应该是一个纯库而不是别的。函数有两种形式,一种是带参数的,另一种是不带参数的。我自己的main()函数没有参数,gtest的
main(argc,*argv[])
函数没有参数。这可能是编译器认为它们不同的原因吗?@ORI是的,可能是这样。但你仍然在违反。