将定义的函数的函数原型放在不同的源文件(不是 header)文件中是否合法/好?
Is it legal / good to put function prototype of a function defined in a different source (not header) file?
我不确定我的描述是否恰当地描述了问题。我在尝试了解外部链接和内部链接时发现了这一点。假设我有一个包含 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();
}
请注意,这两个文件都不是 header。他们只提供2个翻译单元。
我惊讶地发现它可以正确编译和工作。当我在不同的文件中具有相同的效用函数(如线性插值)时,我习惯于编写这样的代码来避免 multi-definition 错误:
//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.
的帮助,人们甚至无法找到函数的定义
static
关键字表示此函数、对象或变量仅在该翻译单元中可用,通常是一个 cpp 文件。您可以在多个 cpp 文件中使用多个 static doSomething
函数。
大约link年龄。为了使用功能,提供原型就足够了。这通常在 h 文件中完成,但您也可以手动提供非静态函数的函数原型。 h 文件只是原型,用于定义函数的外观,以便 c 文件使用它们。正如我所说,您也可以通过其他方式提供原型。这取决于 linker 到 link 一起发挥作用。
第一段代码是合法的,但不是好的做法。最好创建一个 .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();
}
我不确定我的描述是否恰当地描述了问题。我在尝试了解外部链接和内部链接时发现了这一点。假设我有一个包含 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();
}
请注意,这两个文件都不是 header。他们只提供2个翻译单元。
我惊讶地发现它可以正确编译和工作。当我在不同的文件中具有相同的效用函数(如线性插值)时,我习惯于编写这样的代码来避免 multi-definition 错误:
//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.
的帮助,人们甚至无法找到函数的定义static
关键字表示此函数、对象或变量仅在该翻译单元中可用,通常是一个 cpp 文件。您可以在多个 cpp 文件中使用多个 static doSomething
函数。
大约link年龄。为了使用功能,提供原型就足够了。这通常在 h 文件中完成,但您也可以手动提供非静态函数的函数原型。 h 文件只是原型,用于定义函数的外观,以便 c 文件使用它们。正如我所说,您也可以通过其他方式提供原型。这取决于 linker 到 link 一起发挥作用。
第一段代码是合法的,但不是好的做法。最好创建一个 .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();
}