是否可以调用a.cpp中定义的函数在b.cpp中使用而不在任何头文件中声明a.cpp中的函数。
答案 0 :(得分:2)
是的,虽然不值得推荐。
标头实际包含的内容实际上是将标头的内容有效地放入预处理器找到#include
指令的确切位置的源代码中。因此,代替使用include指令,可以手动在该位置编写代码,程序将是相同的:
带标题:
//a.h
void foo();
//a.cpp
#include "a.h"
void foo() {
//do something
}
//b.cpp
#include "a.h"
void bar() {
foo();
}
预处理后,它与:
相同//a.cpp
void foo();
void foo() {
//do something
}
//b.cpp
void foo();
void bar() {
foo();
}
因此,您可以省略标题并在需要调用它的任何位置手动声明该函数。然而,标题确保整个项目的声明是相同的。例如。如果您更改foo
以获取参数:
//a.h
void foo(int);
现在在b.cpp
中,编译器会告诉您调用foo()
与声明不匹配。如果省略标题并手动声明它,如果忘记更改b.cpp
中的声明,编译器将假设有两个版本的foo
,因为你告诉他:
//a.cpp
void foo(int); //version 1
void foo(int i) {
//do something
}
//b.cpp
void foo(); //oops. forgot to change that. compiler assumes a second version
void bar() {
foo(); //ok, try to call version 2...
}
这将编译,但链接器将告诉您有关void foo()
的未定义引用的信息,在b.obj
中调用。