c++ 多个.cpp文件运行

ops/2025/2/28 18:30:09/

目录

方法 1:将其他文件中的 main 改为普通函数

方法 2:使用头文件组织代码 

方法 3:条件编译(仅用于调试或特殊需求) 

方法 4:创建类或命名空间管理逻辑

在一个C++项目中,多个.cpp文件不能同时拥有并运行多个main函数,因为C++程序只能有一个入口点(main函数)。编译器在链接时会报错“multiple definition of main”的错误。不过,有几种方法可以实现你的目标,让多个文件中的代码一起运行:

方法 1:将其他文件中的 main 改为普通函数

将除一个主要.cpp文件外的其他文件的main改为普通函数,然后在主main函数中调用它们。

假设你有两个文件:

file1.cpp

#include <iostream>
void file1_main() {  // 改为普通函数std::cout << "This is from file1\n";
}

file2.cpp 

#include <iostream>
void file2_main() {  // 改为普通函数std::cout << "This is from file2\n";
}

main.cpp 

#include <iostream>// 声明其他文件的函数
extern void file1_main();
extern void file2_main();int main() {std::cout << "This is the main entry\n";file1_main();  // 调用 file1 的代码file2_main();  // 调用 file2 的代码return 0;
}

输出: 

This is the main entry
This is from file1
This is from file2

方法 2:使用头文件组织代码 

将每个.cpp文件中的逻辑提取到函数中,并通过头文件声明,供主main调用。 

file1.h 

#ifndef FILE1_H
#define FILE1_H
void run_file1();
#endif

file1.cpp 

#include <iostream>
#include "file1.h"
void run_file1() {std::cout << "Running file1 logic\n";
}

file2.h 

#ifndef FILE2_H
#define FILE2_H
void run_file2();
#endif

file2.cpp 

#include <iostream>
#include "file2.h"
void run_file2() {std::cout << "Running file2 logic\n";
}

main.cpp 

#include <iostream>
#include "file1.h"
#include "file2.h"int main() {std::cout << "Main program\n";run_file1();run_file2();return 0;
}

方法 3:条件编译(仅用于调试或特殊需求) 

如果你希望保留多个main函数(例如用于单独测试),可以用条件编译来控制哪个main生效。 

file1.cpp 

#include <iostream>
#ifdef FILE1_MAIN
int main() {std::cout << "File1 main running\n";return 0;
}
#else
void run_file1() {std::cout << "File1 logic\n";
}
#endif

file2.cpp 

#include <iostream>
#ifdef FILE2_MAIN
int main() {std::cout << "File2 main running\n";return 0;
}
#else
void run_file2() {std::cout << "File2 logic\n";
}
#endif

main.cpp 

#include <iostream>
extern void run_file1();
extern void run_file2();int main() {std::cout << "Main program\n";run_file1();run_file2();return 0;
}

方法 4:创建类或命名空间管理逻辑

将每个文件的代码封装成类或命名空间,主main函数创建实例或调用命名空间中的函数。

file1.cpp

#include <iostream>
namespace File1 {void run() {std::cout << "File1 running\n";}
}

file2.cpp 

#include <iostream>
namespace File2 {void run() {std::cout << "File2 running\n";}
}

 main.cpp

#include <iostream>
#include "file1.h"  // 如果用头文件声明
#include "file2.h"int main() {std::cout << "Main program\n";File1::run();File2::run();return 0;
}

总结

  • 推荐方法:方法1或方法2,简单直接,适合大多数情况。

  • 如果需要调试灵活性,可以用方法3。

  • 如果项目较大,推荐方法4使用类或命名空间。


http://www.ppmy.cn/ops/162038.html

相关文章

【北大Deepseck】最新2份pdf(附不限速链接) 系列-提示词工程和落地场景 DeepSeek与AIGC应用

前一段时间&#xff0c;清华大学出品了五版DeepSeek学习教程&#xff0c;刷爆了朋友圈。 而北京大学也不甘示弱&#xff0c;悄然释放出的两份份“内部秘籍”——《DeepSeek与AIGC应用》和《提示词工程和落地场景》讲座资料。 不限速获取 这篇文章源自《北京大学&#xff1a;De…

DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略

DualPipe简介 今天是DeepSeek开源周的第四天&#xff0c;官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学&#xff0c;对这个技术并不陌生。 开源地址&#xff1a;https://github.com/deepseek-ai/DualPipe 核心亮点 DualPipe&…

MYSQL学习笔记(十):约束介绍(如:非空、唯一、主键、外键、级联、默认、检查约束)

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇讲解“约束”&#xff0c;如&#xff1a;非空、唯一、主键、外键、级联、默认…

DeepSeek-OpenSourceWeek-第二天-DeepEP

DeepSeek正在进行“开源周”活动,在第二天推出了DeepEP,这是一个面向混合专家(MoE)模型训练和推理的开源通信库。DeepSeek此前的成果已令人印象深刻,此次开源关键组件,体现了其对透明度、社区合作以及推动AI进步的决心,通过5个代码库(已发布2个)来展示这一承诺。 第一…

云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书

云创智城YunCharge 新能源充电行业系统说明书 ⚡官方文档 ⚡官网地址 1. 引言 随着全球环境保护和能源危机的加剧&#xff0c;新能源汽车行业得到了快速发展&#xff0c;充电基础设施建设也随之蓬勃发展。新能源充电行业系统旨在提供高效、便捷的充电服务&#xff0c;满足电…

全面解析:如何查找电脑的局域网与公网IP地址‌

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于网络连接、远程访问、网络诊断等方面都至关重要。无论是出于工作需要&#xff0c;还是解决网络问题&#xff0c;了解怎么查找电脑的IP地址都是一项必备技能。本文将详细介绍几种常见的方法&#xff0c;帮…

【缓存】缓存雪崩与缓存穿透:高并发系统的隐形杀手

缓存雪崩与缓存穿透&#xff1a;高并发系统的隐形杀手 在高并发系统中&#xff0c;缓存是提升性能的重要手段。然而&#xff0c;缓存使用不当也会带来一系列问题&#xff0c;其中最常见的就是缓存雪崩和缓存穿透。这两个问题如果不加以解决&#xff0c;可能会导致系统崩溃&…

check spring configuration解决方法

问题:导入新项目的时候打开idea,会出现checking spring configuration,如下弹窗 这个会极大耗费性能,把IDEA卡的不要不要的. 默默的等它运行完之后右下角出来了这个弹窗 根据提示是这2个文件目录下需要添加spring的配置文件, 直接点击提示的文字 “spring-boot-build.spring-bo…