在一个简单的程序中,使用函数doSomething()打印出“hello,world”。我只在main.cpp文件中输入了这个函数的原型,并在另一个名为do.cpp的文件中输入了该函数的声明。
当我编译程序时它运行正常,即使我没有指定doSomething()的声明将是哪个文件。
答案 0 :(得分:0)
您对功能声明和定义的想法似乎有些混乱。
函数的声明是函数的原型
对于Ex:
void doSomething();
虽然,定义是函数的主体 对于Ex:
void doSomething()
{
}
通常,声明包含在头文件和cpp文件中的定义中。
编译器使用声明来匹配被调用函数的参数,而链接器将定义链接到被调用的函数。
编译是将源文件编译到目标文件的过程 在链接期间,链接器使用所有目标文件来生成可执行文件。链接器可以访问不同的目标文件,因此可以访问其他文件中定义的函数。只要函数名称是唯一的,链接器就会愉快地链接到该特定的定义,以防链接器找到两个以上的匹配项,然后程序中断 One definition rule 并会报告多个定义错误。
另外,请注意链接器只有在调用函数时才需要使用(链接)函数定义,如果你的程序只是声明一个函数,不提供定义而且从不使用(调用)函数那么是任何错误。
答案 1 :(得分:0)
在查找函数定义时,链接器将简单地考虑您要链接的所有文件。
无法链接定义同名函数的多个目标文件,因此没有歧义。