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
相关产品推荐
相关产品推荐

