我不确定我的描述是否恰当地描述了问题。当我试图理解外部联系和内部联系时,我发现了这一点。假设我有一个包含2个文件的项目:
//A.cpp
#include <iostream>
void doSomething();
int main()
{
doSomething();
return 0;
}
//B.cpp
#include <iostream>
void doSomething()
{
std::cout << "Doing it" << std::endl;
std::cin.get();
}
请注意,这两个文件都不是标题。他们只提供2个翻译单元。
我很惊讶地发现这可以编译并正常工作。当我在不同的文件中使用相同的效用函数(如线性插值)时,我常常编写这样的代码来避免多重定义错误:
//A.cpp
#include <iostream>
static void doSomething()
{
std::cout << "Doing it" << std::endl;
std::cin.get();
}
int main()
{
doSomething();
return 0;
}
//B.cpp
#include <iostream>
static void doSomething()
{
std::cout << "Doing it" << std::endl;
std::cin.get();
}
/* some other functions that call doSomething() */
这显然是多余的,上面的方法似乎解决了它。 但我想知道这真的是一种被接受的风格吗?没有IDE的帮助,人们甚至无法找到函数的定义。
答案 0 :(得分:2)
第一段代码是合法的,但这不是好习惯。最好创建一个.h
文件,将函数原型和#include
.h
文件放在使用该函数的所有.cc
文件中。
//B.h
#ifndef B_H
#define B_H
void doSomething();
#endif
//A.cpp
#include <iostream>
#include "B.h"
int main()
{
doSomething();
return 0;
}
//B.cpp
#include <iostream>
#include "B.h"
void doSomething()
{
std::cout << "Doing it" << std::endl;
std::cin.get();
}
答案 1 :(得分:0)
static
关键字表示此函数,对象或变量仅在该转换单元中可用,通常是一个cpp文件。您可以在多个cpp文件中拥有多个static doSomething
函数。
关于联系。为了使用功能,提供原型就足够了。这通常是在h文件中完成的,但是你也可以手动提供非静态函数的函数原型。 h文件只是原型,用于定义函数看起来如何顺序使用c文件。正如我所说,你也可以通过其他方式提供原型。由链接器将这些功能链接在一起。