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

时间:2016-06-04 09:34:03

标签: c++ c

在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 %d\n", getNumber();
         } else if (counter % 3 == 1) {
             //Print out the second person's number
             printf("My number is %d\n", getNumber();
         } else {
             //Print out the third person's number
             printf("My number is %d\n", 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进行第二次调用,使用C.cpp进行第三次调用,然后重复

我可以在while循环中命名函数名称getNumber1()getNumber2()getNumber3()并更改三个C ++文件中的函数名称,但是当有人写入getNumber()函数时,他们不知道它是否已知道将最终成为AB或C.每个人的getNumber()函数应该被称为getNumber()。

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

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

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

谢谢。

6 个答案:

答案 0 :(得分:4)

假设您正在获取他们不想更改的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();
}

答案 1 :(得分:1)

没有办法将具有相同名称和参数列表的多个不同函数放入全局命名空间,即使是来自不同的翻译单元。

但是,C ++允许您使用名称空间来区分具有相同名称的函数:

a.cpp

primaryDark

b.cpp

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

调用者可以使用上下文解析运算符来区分namespace b { int getNumber() { return 205; } } 函数:

getNumber

答案 2 :(得分:1)

如果您需要选择在运行时调用的函数,可以执行以下操作。

不是在头文件中给出函数原型,而是创建一个函数指针数组:

 AttributeError: 'NoneType' object has no attribute 'next_element'

在main.cpp中:

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

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

GetNumberType functions[5];

现在,您可以在main.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() { ... } 并调用它们。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

  

有没有,我编译程序并使用A.cpp中的getNumber()进行第一次调用,B.cpp进行第二次调用,然后使用C.cpp进行第三次调用,然后重复。

不,没有。函数int getNumber()可以有一个定义。

如果你想将它们编译成一个程序,那么

  1. 编写源文件的人必须每个都使用一个唯一的名称(可能使用名称空间,或者只是一个不同的函数名称),或者如果这不是一个选项,那么
  2. (或负责编译和链接文件的人)必须修改您(或他们)收到的源文件,以便每个函数都有唯一的名称。
  3. 选项2.可以使用预处理自动化。 c预处理器可能会实现您正在尝试的功能,但另一方面,编写自己的程序来处理文件可能更简单。

    另一种方法可能是用包装器来增加每个单独的源文件(这个修改就在c预处理器的小巷中),它定义了main函数,它只调用一次函数。然后将每个编译成一个单独的程序。然后编写将其他程序作为子进程生成的主程序。

答案 5 :(得分:0)

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