使用C++练习Project Euler时如何优化文件组织减少冗余文件?
解决方案
有两种常用的轻量化方案可以实现每道题仅对应一个CPP文件的需求:
方案1:主文件+单CPP文件模式,无需额外头文件
不需要为每个题目单独写头文件,直接在主文件中用extern关键字声明要调用的函数即可,每道题仅保留一个独立的CPP文件。
- 主文件代码示例(以运行第2题为例):
// 直接声明外部函数,不需要引入头文件 extern void solve2(); int main() { solve2(); return 0; }
- 对应的Problem2.cpp代码,无需额外头文件:
#include <iostream> void solve2() { // 你的解题代码 int answer = 42; std::cout << answer; }
操作逻辑:切换题目时,只需要把主文件里的extern声明和调用的函数名改成对应题目编号,同时把对应题目的CPP文件添加到当前项目中即可,不需要额外维护头文件。
方案2:单题独立可运行,无需修改主文件
更适合刷题场景,不用每次调整主函数代码:
每道题的CPP文件都单独写完整的main函数,比如Problem3.cpp内容:
#include <iostream> int main() { // 解题代码 int answer = 123; std::cout << answer; return 0; }
操作逻辑:所有题目CPP都放在同一个项目里,做哪道题的时候,右键点击其他题目的CPP文件,选择「属性」-「常规」-「从生成中排除」,选择「是」即可,每次编译只会运行当前没有被排除的题目的main函数,完全不需要修改任何代码,切换题目只需要调整文件的生成排除状态即可。
进阶可选:用宏实现一键切换题目
如果你不想每次改主文件的函数名,可以用预处理器拼接功能简化操作:
主文件代码:
#define SOLVE_FUNC(id) solve##id #define DECLARE_SOLVE(id) extern void SOLVE_FUNC(id)() // 在这里修改要运行的题目编号即可 #define CURRENT_PROBLEM 2 DECLARE_SOLVE(CURRENT_PROBLEM); int main() { SOLVE_FUNC(CURRENT_PROBLEM)(); return 0; }
切换题目时只需要修改CURRENT_PROBLEM后的数字即可,不需要改其他代码。
内容的提问来源于stack exchange,提问作者IX Nap Time
相关产品推荐
相关产品推荐

