首页 > 编程语言 >P2 C++ 编程范式

P2 C++ 编程范式

时间:2024-05-16 21:52:19浏览次数:29  
标签:P2 main 范式 ++ C++ 编译 cpp foo

章节 链接
代码链接

目录

2.1.1 C++ 工程的一般组织结构

一般情况下,C++工程的组织结构是将不同的功能封装在不同的类中,每个类用配套的头文件源文件来实现,头文件可以是*.h*.hpp之类的文件,源文件可以是*.cc*.cpp之类的文件。最后在 main 函数中,调用类来实现具体的功能。

2.1.2 C++ 工程在机器人中的组织结构

在机器人项目中,C++ 工程代码通常分成两个部分:一个部分用于实现具体算法,另一个部分用于进行 ROS 接口封装
ROS 接口负责数据输入、数据输出以及核心算法调用

2.2 C++ 代码的编译

3 种 编译工具: g++、make、CMake

foo.h

// 宏定义  防止头文件 重复包含与编译
#ifndef FOO_H_
#define FOO_H_

#include <string>

// 命名空间设置  防止出现 重复的函数与变量
namespace foo{
    class MyPrint{
        // 声明类 具体函数实现 在 foo.cpp 中
    public:
        MyPrint(std::string output); // 构造函数
        void ExcutePrint();

        std::string output_;
    };
}
#endif

foo.cpp

#include "foo.h" // 首先在 当前目录 下搜索需要包含的文件
#include <iostream> // 首先在系统头文件目录中搜索需要包含的文件
#include <string>
// 
// 如果是标准库函数的头文件,则使用<>包含头文件;如果是自定义的头文件,优先使用" "包含头文件。

namespace foo{
    MyPrint::MyPrint(std::string output):output_(output){
        std::cout << "class MyPrint create a object!";
        std::cout << std::endl;
    }
    void MyPrint::ExcutePrint(){
        std::cout << output_ << std::endl;
    }
}

main.cpp

#include "foo.h"

int main(int argc, char** argv){
    // 创建 类 MyPrint 的实例对象, 并传入 初始化参数
    foo::MyPrint my_print("I can output string!");
    my_print.ExcutePrint(); //  调用 对象中的成员函数
    return 0;
}

2.2.1 g++ 编译

若未安装 g++:sudo apt install g++
已安装则跳过。

预处理、编译、汇编、连接。

g++ foo.cpp main.cpp -o demo
./demo

2.2.2 make 编译

makefile

start: # 命令块 命名  下面的命令后不能加注释。 是直接在 命令行界面 运行的指令
	g++ -o foo.o -c foo.cpp  
	g++ -o main.o -c main.cpp 
	g++ -o demo foo.o main.o 
clean: 	# 删除 中间文件 
	rm -rf foo.o main.o

✅ 2.2.3 CMake 编译

CMake可以自动处理程序之间的关系,并产生对应的 makefile 文件,然后调用 make 就可以编译了。

CMakeLists.txt

# 声明 CMake 的最低版本
cmake_minimum_required(VERSION 2.8)

# 声明 CMake 工程名
project(demo)

include_directories("${PROJECT_BINARY_DIR}")

# 创建库文件
add_library (foo foo.cpp)
# 创建 可执行文件
add_executable (demo main.cpp)
# 为 可执行文件 连接依赖库
target_link_libraries (demo foo)

在 源文件 所在目录 打开命令行窗口。

mkdir build
cd build 
cmake ..
make 
./demo

C++ 编程风格 可参考:https://github.com/google/styleguide?tab=readme-ov-file

标签:P2,main,范式,++,C++,编译,cpp,foo
From: https://www.cnblogs.com/zhagen0001000/p/18196547

相关文章

  • [NOIP2001 提高组] 数的划分
    个人博客传送锚点:https://www.acwing.com/blog/content/55495/传送锚点:https://www.luogu.com.cn/problem/P1025题目描述将整数$n$分成$k$份,且每份不能为空,任意两个方案不相同(不考虑顺序)。例如:$n=7$,$k=3$,下面三种分法被认为是相同的。$1,1,5$;$1,5,1$;$5,1,1$.问有多......
  • 从C到C++
    const关键字用法(1)定义常量#include<iostream>usingnamespacestd;intmain(){ constintMAX_VAL=23; constdoublePi=3.14; constchar*SHOOL_NAME="SDWU"; return0;}(2)定义常量指针不可以通过常量指针修改指向的内容.#include<iostream>usingnam......
  • C++_交叉编译和pybind11
    编译本地编译和交叉编译本地编译当前平台编译交叉编译交叉编译是指在一个平台上编译另一个平台上运行的代码。在C++中,交叉编译通常涉及以下步骤:安装交叉编译工具链。配置编译环境。使用工具链编译代码。首先,确保安装了交叉编译工具链,例如gcc-arm-l......
  • C++模板编程-enable_if
    std::enable_if的使用对于重载的函数或者函数模板的选择上,编译器内部有一个自己的规则,并不是简单粗暴的对函数就优先选择,对函数模板就靠后选择替换失败并不是一个错误(SFINAE):SubstitutionFailureIsNotAnError,SFINAE看成是C++语言的一种特性或者说一种模板设计中要遵循的......
  • 深度解读《深度探索C++对象模型》之C++虚函数实现分析(三)
    “深度解读《深度探索C++对象模型》”系列已经在CSDN上和我的公众号上更新完毕,请有需要的同学移步到我的CSDN主页里去阅读,主页地址:https://blog.csdn.net/iShare_Carlos?spm=1010.2135.3001.5421或者敬请关注我的公众号:iShare爱分享前面两篇请从这里阅读:深度解读《深度探索C+......
  • Vue3开发新范式,不用`ref/reactive`,不用`ref.value`
    什么是Cabloy-Front?Cabloy-Front是一款支持IOC容器的Vue3框架。不用ref/reactive,不用ref.value,不用pinia与UI库的配合Cabloy-Front可以搭配任何UI库使用,并且内置了几款UI库的项目模版,便于开箱即用,包括:antdvelement-plusquasarvuetify特性Cabloy-Front为Vue......
  • 《Effective C++》第三版-5. 实现(Implementations)
    目录条款26:尽可能延后变量定义式的出现时间(Postponevariabledefinitionsaslongaspossible)条款27:尽量少做转型动作(Minimizecasting)条款28:避免返回handles指向对象内部成分(Avoidreturning“handles”toobjectinternals)条款29:为“异常安全”而努力是值得的(Striveforexc......
  • C++:自定义异常
    #include<iostream>#include<stdexcept>//自定义异常类classMyException:publicstd::exception{public://重写what()函数以提供异常的描述,const表示函数不会改变类的成员变量,noexcept表示不会抛出异常constchar*what()constnoexceptoverride{......
  • C++ 对象池
    对象池概念对象池模式(ObjectPoolPattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利用已有的对象来处理请求,减少频繁创建对象所占用的内存空间和初始化时间。对象池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非......
  • C++基础篇
    输入输出流iostream向流写入数据<<运算符<<运算符接受两个运算对象,此运算符将给定的值写到给定的ostream对象中:左侧:运算对象为ostream对象,如cout、cerr、clog右侧:运算对象是要打印的值输出结果:写入给定值的那个ostream对象,即此运算符返回其左侧的运算对象。表达式等价于:(std......