C/C++ 协助处理 C 中的多个文件
C/C++ assistance with working with multiple files in C
我有一个有 3 个文件的项目。文件 A 是 main.cpp,而另外两个分别包含一个函数(文件 B 包含 FOO(),文件 C 包含 FOO(int, double))。 我想做的是链接文件 A 中的 main() 可以调用文件 B 中的 FOO(),这应该在文件 C 中调用 FOO(int, double)。
注意:我在这里没有使用C程序中的任何特定头文件。
C.h:
FOO(int, double);
B.h:
#include "C.h"
FOO();
主.cpp:
#include "B.h"
要编译的命令:
g++ -I. -c main.cpp
g++ -c B.cpp C.cpp
g++ -o final_executable main.o B.o C.o
基本上,您首先为要调用的函数提供原型。然后编译 B、C 和 main(但不链接它们中的任何一个) - -c
参数禁止链接。这将创建对象文件。最后,将所有三个对象文件链接到可执行文件中。
当您希望软件的"独立"组件相互交互时,您无法摆脱定义接口。在这种情况下,您决定定义组件main.cpp
、B.cpp
和C.cpp
。对于main()
在B.cpp
中调用FOO()
,C++语言类型规则要求原型首先存在。这至少有两个有用的目的。它允许编译器静态检查函数在编译时是否传递了正确的参数。它还为编译器提供了足够的信息来有效地管理函数参数(例如,堆栈与寄存器)。大多数情况下,接口是在头文件中定义的,因此使用它们应该感觉很自然。
有时,软件是使用动态界面开发的。在这种情况下,要调用的函数是在运行时确定的。dlopen
、dlsym
和 dlclose
调用可用于实现此目的。一个简单的例子可能是:
// main.cpp
int main () {
void *dh = dlopen(0, RTLD_LAZY);
void (*B_FOO_PTR)(void)
= *static_cast<void (**)(void)>(dlsym(dh, "B_FOO_PTR"));
dlcose(dh);
B_FOO_PTR();
}
// B.cpp
static void FOO () {
void *dh = dlopen(0, RTLD_LAZY);
void (*C_FOO_PTR)(int, double)
= *static_cast<void (**)(int, double)>(dlsym(dh, "C_FOO_PTR"));
dlcose(dh);
C_FOO_PTR(0, 1.0);
}
extern "C" { void (*B_FOO_PTR)(void) = &FOO; }
// C.cpp
static void FOO (int, double) {
//...
}
extern "C" { void (*C_FOO_PTR)(int, double) = &FOO; }
相关文章:
- 出色的文件处理能力
- C++中的文件处理:更新行
- 文件处理,eof() 定义
- C++网络 IO、文件处理和网络故障
- 如何使用自定义对象的序列化在 c++ 中编写自定义二进制文件处理程序
- ios::app 和 ios::noreplace 模式在文件处理中有什么区别?
- 我将如何在C++中文件处理对象(存储/导入)
- 如何为多个文件处理选择最佳的I/O策略
- read() 的参数类型,用于 c++ 中的文件处理
- STD :: FSTREAM文件处理重复使用的问题
- C 文件处理打开
- 将文件处理作为参数
- 如何在 C++ 中的文件处理中删除文件
- 文件处理I/O C 错误
- 在 c++ 的文件处理中什么是 tellg(),它是如何工作的?
- 循环的文件处理
- c++中数据文件处理中的分段错误
- 数据文件处理-查找文件中的字数
- 文件处理 - 错误:与 while 循环 (C++) 中的"运算符>>"不匹配(代码::块)
- 使用.rose(文件扩展)CPP的文件处理