You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下用g++高效编译C++多文件程序及代码规范咨询

高效编译多文件C++程序的方法

方法1:使用Makefile

创建名为Makefile的文件,内容如下:

# 编译器配置
CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++11

# 可执行文件名称与源文件列表
TARGET = my_program
SRCS = main.cpp miscClass1.cpp
OBJS = $(SRCS:.cpp=.o)

# 生成可执行文件的规则
$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)

# 编译单个cpp文件为目标文件的通用规则
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 清理编译产物的规则
clean:
	rm -f $(OBJS) $(TARGET)

使用方式:

  • 终端执行make,自动增量编译修改过的文件,生成可执行文件my_program
  • 执行make clean可删除所有编译生成的文件

方法2:使用CMake(适合大型项目)

创建CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)
project(MyProgram)

# 指定C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加源文件并生成可执行文件
add_executable(my_program main.cpp miscClass1.cpp)

编译步骤:

mkdir build
cd build
cmake ..
make

CMake会自动处理依赖关系,支持跨平台,大型项目维护更便捷。


代码中的不良实践
  • 全局作用域导入std命名空间:using namespace std;会把std下所有符号导入全局空间,大型项目极易引发命名冲突,建议在函数内使用该语句,或直接写std::cout、std::endl。
  • 构造函数未用成员初始化列表:当前构造函数在函数体内给成员变量赋值,对于非基本类型会先默认构造再赋值,效率更低。应改为:
    miscClass1::miscClass1(int x, int y) : X(x), Y(y) {}
    
  • 访问函数未加const修饰:getX()、getY()这类不修改成员变量的函数,必须添加const修饰,才能在const对象上调用。修改后声明与定义应为:
    // 头文件中
    int getX() const;
    int getY() const;
    // 源文件中
    int miscClass1::getX() const { return X; }
    int miscClass1::getY() const { return Y; }
    
  • 冗余的返回值括号:return (X);中的括号完全多余,直接写return X;即可,代码更简洁。
  • 注释表述模糊:addXY()的注释//adds the two variables x and y指代不明,应明确说明是成员变量的和,比如// 返回成员变量X和Y的和。
  • 命名风格不一致:类名miscClass1是小驼峰(首字母小写),成员变量X、Y为大写,建议统一风格,比如类名首字母大写为MiscClass1,成员变量用x_、y_格式,提升可读性。
  • 头文件保护可优化:当前#ifndef的写法是正确的,但C++11及以后可使用#pragma once(主流编译器均支持),写法更简洁:
    #pragma once
    class miscClass1 { ... };
    

内容的提问来源于stack exchange,提问作者AdamT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:48:19