C++编译多个具有相同函数名的文件

C++ compile multiple files with same function name

本文关键字:函数 文件 编译 C++      更新时间:2023-10-16

在printNumbers.h文件中

//Write a function getNumber() and put your favourite number inside! 
//I will then compile the program and print everyone's favourite number!
int getNumber(void);

如果我想继续打印出三个人最喜欢的数字

int main() {
int counter = 0;
while(counter < 9999) {
if(counter % 3 == 0) {
//Print out the first person's number
printf("My number is %dn", getNumber();
} else if (counter % 3 == 1) {
//Print out the second person's number
printf("My number is %dn", getNumber();
} else {
//Print out the third person's number
printf("My number is %dn", getNumber();
}
//Keep printing everyone's numbers until counter reaches 9999
counter++;
}
return 0;
}

3个人给了我他们写的C++文件,我把每个文件都重命名为A.cpp B.cpp C.cpp。它可能是随机顺序的,所以他们不知道他们的文件最终是A B还是C

他们本可以编写的c++文件示例

int getNumber() {
//Each person can write their own function to return whatever number they want
int myNumber = 1;
return myNumber;
}

不管怎样,我是否可以编译程序,并在第一次调用中使用A.cpp中的getNumber(),在第二次调用中从B.cpp中使用getNumber(

我可以在while循环中命名函数名getNumber1()getNumber2()getNumber 3(),并更改三个C++文件中的函数名,但当有人编写getNumber()函数时,他们不知道它最终是A B还是C。

编辑:很多人都在建议使用名称空间。我无法控制.h文件和给人们的ADT,所以他们编写的程序不会使用名称空间。此外,许多人可能会向我提交C++文件,我不得不将他们随机分组为3组(因为我的程序只能打印3个人的号码),所以他们不知道该使用什么名称空间。.

编辑:一些人建议修改.h文件或他们编写的程序。我们都得到了.h文件,但我们无法更改它。我们将文件(如示例)提交给学校,他们能够完成我的主要功能(我不知道他们是如何完成的)。我的主函数将允许用户在提交之前更好地测试他们的getNumber()函数,因此它是学校的一个单独程序,用户可以选择使用。

如果有什么令人困惑或不清楚的地方,请问我问题,澄清我的问题!

谢谢。

假设您正在获取它们的cpp文件,而不是编译和链接它们,那么您可以将它们包括在您的cpp中,就像这个

namespace A {
#include "A.cpp"
}
namespace B {
#include "B.cpp"
}
namespace C {
#include "C.cpp"
}
int main ()
{
A::getNumber();
B::getNumber();
C::getNumber();
}

即使来自不同的转换单元,也无法将具有相同名称和参数列表的多个不同函数放入全局命名空间。

然而,C++允许您使用命名空间来区分同名函数:

a.cpp

namespace a {
int getNumber() {
return 1;
}
}

b.cpp

namespace b {
int getNumber() {
return 205;
}
}

调用方可以使用上下文解析运算符来区分getNumber函数

if(counter % 3 == 0) {
//Print out the first person's number
printf("My number is %dn", a::getNumber();
} else if (counter % 3 == 1) {
//Print out the second person's number
printf("My number is %dn", b::getNumber();
} else {
//Print out the third person's number
printf("My number is %dn", c::getNumber();
}

如果您需要选择在运行时调用的函数,下面是您可以做的。

与其在头中给出函数原型,不如创建一个函数指针数组:

typedef void (*GetNumberType)();
extern GetNumberType functions[5];

在main.cpp中:

GetNumberType functions[5];

在A、B、C.cpp:中的每一个中

class Register
{
Register()
{
int i =0;
// find a place to put the function in
while(functions[i]) i++;
functions[i] = &getNumber;
}
};
Register r;
void getNumber()
{
...
}

现在,您可以在main.cpp中迭代functions并调用它们。

您需要将每个用户的c++文件编译成一个独立的可执行/DLL/可调用代码,然后从主程序中调用这些代码来获取数字。

在所有情况下,页眉都相同,您没有其他选择。

在Windows上,您可以将每个文件编译为dll,然后动态加载函数。

不管怎样,我是否可以编译程序,并在第一次调用中使用来自A.cpp的getNumber(),在第二次调用中从B.cpp,在第三次调用中来自C.cpp,然后重复。

不,没有。对于函数CCD_ 3,可以恰好有一个定义。

如果你想把它们编译成一个单独的程序,那么

  1. 编写源文件的人必须每个都使用一个唯一的名称(可能使用名称空间,或者只是一个不同的函数名),或者如果这不是一个选项,那么
  2. (或负责编译和链接文件的人员)必须修改您(或他们)收到的源文件,以便每个函数都有一个唯一的名称

选项2。可以使用预处理实现自动化。c预处理器可能会实现您想要做的事情,但另一方面,编写自己的程序来处理文件可能会更简单。

另一种方法可以是用包装器来扩充每个单独的源文件(这种修改正好符合c预处理器的要求),它定义了main函数,只需调用该函数一次。然后将每个程序编译成一个单独的程序。然后编写主程序,将其他程序派生为子进程。