c++ 多个.cpp文件运行

目录

方法 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.mzph.cn/diannao/72032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OFDR的层压陆相页岩油储层中非对称裂缝群传播的分布式光纤监测

关键词&#xff1a;OFDR、分布式光纤传感、裂缝传播 一. 概述 四川盆地凉高山组优质页岩油储层存在复杂的垂直重叠岩性&#xff0c;大陆页岩油储层存在发育层理&#xff0c;薄层和天然裂缝&#xff0c;对水平井多级压裂技术的裂缝网络形态控制和监测构成挑战。本研究提出了一…

UniApp 按钮组件 open-type 属性详解:功能、场景与平台差异

文章目录 引言一、open-type 基础概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值详解2.1 contact - 客服会话功能说明平台支持代码示例 2.2 share - 内容转发功能说明平台支持注意事项 2.3 getUserInfo - 获取用户信息功能说明平台支持代码示例 2.4 getPhoneNumber -…

【大模型】Ubuntu下 fastgpt 的部署和使用

前言 本次安装的版本为 fastgpt:v4.8.8-fix2。 最新版本fastgpt:v4.8.20-fix2 问答时报错&#xff0c;本着跑通先使用起来&#xff0c;就没有死磕下去&#xff0c;后面bug解了再进行记录。   github连接&#xff1a;https://github.com/labring/FastGPT fastgpt 安装说明&…

【GenBI实战】python脚本实现基于DeepSeek api的数据查询和图表可视化

写在前面 生成式 BI (GenBI) 正在改变我们与数据交互的方式。它允许用户使用自然语言提出问题&#xff0c;并自动获得数据洞察&#xff0c;而无需编写复杂的 SQL 查询或手动创建图表。本文将带你动手实战&#xff0c;使用 Python 和 DeepSeek API (或其他类似的大语言模型 API…

Web-to-Web和Server-to-Serve归因方法

Web2Web 和 S2S 归因方法 1. Web2Web 归因方法 原理&#xff1a; Web2Web&#xff08;Web-to-Web&#xff09;归因方法主要用于跟踪用户在网站之间的行为路径。它通过浏览器中的Cookie或其他标识符来追踪用户在不同网站之间的行为&#xff0c;从而确定用户转化的路径。 使用…

c++中迭代器和指针有什么区别?

在 C 中&#xff0c;迭代器和指针虽然在某些场景下有相似的行为&#xff0c;但它们在设计目的、功能和使用场景上有本质区别。以下是详细对比和最佳实践&#xff1a; 一、核心区别对比表 特征指针迭代器本质原生数据类型&#xff0c;直接存储内存地址类对象&#xff0c;抽象容…

如何使用Docker搭建哪吒监控面板程序

哪吒监控(Nezha Monitoring)是一款自托管、轻量级的服务器和网站监控及运维工具,旨在为用户提供实时性能监控、故障告警及自动化运维能力。 文档地址:https://nezha.wiki/ 本章教程,使用Docker方式安装哪吒监控面板,在此之前,你需要提前安装好Docker. 我当前使用的操作系…

ONLYOFFICE + Ollama,本地AI模型的高效集成方案

这篇文章将继续探讨如何在 ONLYOFFICE 中连接并高效使用各类 AI 模型。今天的主角是 Ollama——一个专为本地部署和运行 AI 模型的平台。如何使用 Ollama 并与 ONLYOFFICE 编辑器集成&#xff0c;利用其强大的 AI 模型处理文本任务。以下是详细的操作步骤和使用方法。 关于 ONL…

单片机开发为什么不用C++?

最近受到很多初学者的灵魂拷问&#xff0c;单片机需要学C吗&#xff1f; 还别说&#xff0c;问这问题的还挺多的&#xff0c;今天以一篇文章来说下。 很多小白觉得&#xff0c;C语言这老古董&#xff0c;语法简陋得像石器时代的产物&#xff0c;为什么还牢牢霸占着单片机开发的…

2025-02-28 学习记录--C/C++-C语言 scanf 中,%s 不需要加

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 scanf 中&#xff0c;%s 不需要加 & 格式化符号变量类型是否需要加 &原因%s字符数组不需要数组名本身就是指针&a…

数字样机:从技术革新到产业赋能的演进之路

摘要&#xff1a;数字样机作为产品全生命周期数字化的核心技术&#xff0c;旨在通过虚拟化建模与仿真技术重构传统工业研发范式。 数字样机&#xff08;Digital Prototype&#xff0c;DP&#xff09;技术是一种数字化设计技术&#xff0c;利用数字样机替代原型样机&#xff0c…

Ubuntu20.04安装Isaac sim/ Isaac lab

2025年之后omniverse好像不能直接装Isaac sim了&#xff0c;要跳转到官网链接。 Isaac lab要在Isaac sim安装之后才能安装 Ubuntu20.04安装Isaac sim/ Isaac lab Isaac sim安装Isaac lab安装 Isaac sim安装 找到官网 Isaac sim官方文档 下载下来解压到本地文件夹&#xff0c…

【前端】XML,XPATH,与HTML的关系

XML与HTML关系 XML&#xff08;可扩展标记语言&#xff09;和 HTML&#xff08;超文本标记语言&#xff09;是两种常见的标记语言&#xff0c;但它们有不同的目的和用途。它们都使用类似的标记结构&#xff08;标签&#xff09;&#xff0c;但在设计上存在一些关键的差异。 XML…

8款智能排班系统,全面深入介绍

本文介绍了以下8款主流的排班系统&#xff1a;1.i人事&#xff1b;2.Moka&#xff1b; 3.When I Work&#xff1b; 4.薪人薪事&#xff1b; 5.泛微e-office&#xff1b; 6.多可软件&#xff1b; 7.钉钉&#xff1b; 8.Homebase等。 排班系统作为一种高效的管理工具&#xff0c;…

DeepSeek 助力 Vue3 开发:打造丝滑的页脚(Footer)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

SpringCloud 微服务框架

单体架构&#xff1a;将业务全部功能集中到一个项目中&#xff0c;打成一个war包存储,部署在一台服务器中&#xff0c;只有一个数据库 优点 &#xff1a;架构简单&#xff0c;部署成本低。适合小型项目 问题&#xff1a;高并发性能问题&#xff0c;开发时代码耦合问题&#x…

goLand导入git项目并打包发布linux

作为项目管理&#xff0c;拥有半吊子开发能力&#xff0c;居然有一天需要修改维护go项目。。。从菜鸟教程学习开始~苦 goland导入git项目 本地启动 导入之后会自动更新相关依赖。 本人导入之后立马修改了依赖位置&#xff0c;且修改为一项目一位置&#xff0c;互不干涉。 在代…

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中&#xff0c;使用合适的工具和插件可以极大地提高我们的工作效率。今天&#xff0c;我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件&#xff0c;这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者&#xff0c;本文都将为你提供…

【设计模式精讲】开源实战之剖析Spring框架:Spring中工厂模式的应用

文章目录 第七章 开源实战7.1 剖析Spring框架中用到的经典设计模式7.1.1 Spring中工厂模式的应用7.1.1.1 Spring中的Bean组件7.1.1.2 Spring中的BeanFactory7.1.1.3 Spring中的FactoryBean 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 第七章 开…

[数据结构]用栈实现队列

思路分析 代码实现&#xff1a; typedef int STDataType; typedef struct Stack {int* a;int top;//下标int capacity; }ST; //栈的初始化 void STInit(ST* ps); //栈的插入 void STPush(ST* ps, STDataType x); //栈的删除 void STPop(ST* ps); // int STSize(ST* ps); //判断…