ardupilot开发 --- C嘎嘎 篇

在这里插入图片描述

长生不老?三界六道不就毁在这4个字上?

溜撒点一起上吧

  • cout和cin的使用,标准输入输出
  • << 和 >> 的使用
  • 数据类型(函数)模板的使用:
  • 命名空间的使用,std命名空间
  • 语句块
  • new 的使用
  • 引用 &
  • 共用体union
  • 类对象的赋值:operator函数
  • Ubuntu C++程序中执行shell命令
  • Linux中的C++编译器
  • #include<> 和 #include" "
  • gcc/g++编译C++程序时常用的环境变量有哪些?
  • VSCode 中F12无法打开#include中的头文件

小生之前拥有C语言的基础,大学时学过机遇MFC的C++编程,硕士时对matlab语言比较熟悉,亦接触过一个开源的C++飞控源代码项目,并修改过,因此学习C++我采用了查漏补缺和拾遗的方式,即遇到不会的、陌生的、就查、就记、就学,如此而已,希望C++待我如初恋,QAQ,我们开始吧,好记性不如烂笔头,书山有路勤为径,学海无涯苦作舟!!

cout和cin的使用,标准输入输出

C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。

C++ 基本的输入输出 | 菜鸟教程

<< 和 >> 的使用

int a = 21;
int c ;
c = a;
c <<= 2;
cout << "Line 7 - <<= 运算符实例,c 的值 = : " <<c<< endl ;

数据类型(函数)模板的使用:

命名空间的使用,std命名空间

语句块

#include
using namespace std;

int main()
{
{
int x=1;
cout << x << endl;
{
cout << x << endl;
int x=2;
cout << x <<endl;
{
cout << x <<endl;
int x=3;
cout << x <<endl;
}
cout << x <<endl;
}
cout << x << endl;
}
return 0;

输出结果 1 1 2 2 3 2 1 
在第一例每个语句块中,虽然变量名都一样,但是int x= ;之后x就变成另外一个变量了
且生存周期仅限于当前的语句块中

new 的使用

引用 &

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。例如:

#include
using namespace std;
int main ()
{
// 声明简单的变量
int i;
// 声明引用变量
int& r = i;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of i : 5
Value of i reference : 5
引用通常用于函数参数列表和函数返回值。

用于函数参数:

#include
using namespace std;

// 函数声明
void swap(int& x, int& y);

int main ()
{
// 局部变量声明
int a = 100;
int b = 200;

cout << “交换前,a 的值:” << a << endl;
cout << “交换前,b 的值:” << b << endl;

/* 调用函数来交换值 */
swap(a, b);

cout << “交换后,a 的值:” << a << endl;
cout << “交换后,b 的值:” << b << endl;

return 0;
}

// 函数定义
void swap(int& x, int& y)
{
int temp;
temp = x; /* 保存地址 x 的值 /
x = y; /
把 y 赋值给 x /
y = temp; /
把 x 赋值给 y */

return;
}

用于函数返回值:

通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用,方式与返回一个指针类似。

当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如,请看下面这个简单的程序:

#include

using namespace std;

double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};

double& setValues(int i) {
double& ref = vals[i];
return ref; // 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i],最后再返回 shit。

}

// 要调用上面定义函数的主函数
int main ()
{

cout << “改变前的值” << endl;
for ( int i = 0; i < 5; i++ )
{
cout << “vals[” << i << "] = ";
cout << vals[i] << endl;
}

setValues(1) = 20.23; // 改变第 2 个元素
setValues(3) = 70.8; // 改变第 4 个元素

cout << “改变后的值” << endl;
for ( int i = 0; i < 5; i++ )
{
cout << “vals[” << i << "] = ";
cout << vals[i] << endl;
}
return 0;
}

共用体union

union中的3个数据成员共享1块内存,且3个数据成员的内存起始地址一样,这在内存紧张的情况下非常有用。

union中最多只有一个数据成员是有意义的。

共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字union来定义

共用体声明和共用体变量定义与结构体十分相似。其形式为:

union 共用体名{

数据类型 成员名;

数据类型 成员名;

} 变量名;

共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。

在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。

几种定义方法:

union u_type1 { int i; double d; char c[10]; };

u_type1 u1; u1.i = 1;

union u_type2 { int i; double d; char c[10]; } u2;

union { int i; double d; char c[10]; } u3;

类对象的赋值:operator函数

对象的初始化可以在定义时将初始化参数传递给构造函数。

也可以什么都不传,后续再赋值,如:

vpBasicFeature *current_s;//定义对象

current_s = (*it_s);//赋值

此时这个赋值符号=会调用类中的这个operator函数:

/*!

Copy operator.

*/

vpBasicFeature &vpBasicFeature::operator=(const vpBasicFeature &f)

{

s = f.s;

dim_s = f.dim_s;

nbParameters = f.nbParameters;

deallocate = f.deallocate;

if (flags)

delete[] flags;

flags = new bool[nbParameters];

for (unsigned int i = 0; i < nbParameters; i++)

flags[i] = f.flags[i];

return (*this);

}

Ubuntu C++程序中执行shell命令

文言一心
待续…

Linux中的C++编译器

在Linux系统中,C++常用的编译器主要有以下几种,每种编译器都有其独特的特点和优势:

  • GNU Compiler Collection (GCC)
    特点
    • 广泛使用:GCC是Linux系统中最常用的编译器之一,支持C、C++、Ada、Fortran等多种编程语言。
    • 兼容性:GCC能够支持多种不同的目标体系结构,如X86、ARM、PowerPC等,同时它也能运行在不同的操作系统上,如Linux、Solaris、Windows等。
    • 标准库:GCC安装时会同时安装C++的标准库,使得开发者可以方便地使用标准库中的功能。
    • 优化能力:GCC提供了多种编译优化选项,可以帮助开发者生成更高效的代码。
  • G++
  • Clang
  • Intel C++ Compiler (ICC)
  • Turbo C++ Compiler

总结:
在Linux系统中,GCC因其广泛的兼容性和强大的优化能力而成为最常用的C++编译器。Clang则以其快速、占用内存少和强大的静态分析能力受到开发者的青睐。ICC则适合对性能有极高要求的开发者,特别是在使用Intel处理器时。而Turbo C++虽然主要用于Windows环境,但在Linux下通过特定工具也能使用,且适合初学者学习C++语言。开发者可以根据自己的需求和偏好选择合适的编译器。

#include<> 和 #include" "

#include指令用于导入其他头文件到当前文件位置。
假如编译器使用的是gcc,那么gcc在执行 #include<> 和 #include" “时到底做了什么?
什么时候用 #include<>?什么时候用 #include” " ?

  • #include<> 的搜索路径包括
    默认配置下,执行#include<>时编译器gcc会到这几个目录下寻找头文件:
    • 编译器设置的include路径
      • /usr/include:C/C++语言标准库的头文件安装路径。
      • /usr/local/include:用户手动安装的第三方库的头文件安装路径。
    • 环境变量包含的路径
      • CPLUS_INCLUDE_PATH,对于C++,
      • C_INCLUDE_PATH,对于C
    • 预配置的路径
      与编译器的安装和配置有关,如 /usr/lib/gcc/x86_64-linux-gnu/版本号/include
    • gcc -I指定的额外路径,如:
      main.c:#include <myheader.h>
      myheader.h位于:/home/user/include
      gcc -I/home/user/include main.c -o main
  • #include" " 的搜索路径包括
    在当前文件所在的目录、子目录中查找头文件;若找不带则到标准库目录中查找。

扩展知识点:

  • C/C++标准库;
  • C/C++标准库的存放路径;
  • GCC 是Linux系统中最常用的C/C++编译器之一;
  • ‌在Linux中,安装gcc/g++时,通常会同时安装C和C++的标准库,标准库的库文件(.so, .o)会被安装到/usr/lib下,标准库的头文件(.hpp, .h)会被安装到/usr/include下;
  • 常用的C语言标准库如 stdio.h、stdlib.h、string.h、math.h 等;
  • 常用的C++标准库如 iostream、string、vector 等;
  • 一些与编译器有关的库可能会被编译器安装在/usr/lib/gcc/x86_64-linux-gnu/版本号/include;
  • 注意,#include<>、" "的搜索路径与环境变量PATH无关。PATH用于在Linux中指定在哪些目录中寻找可执行程序,便于让你在任何目录下都能执行已安装的程序而不需要加上绝对路径。
  • make的底层调用的是gcc吗?是的。
  • 可用pkg-config查找某库的安装路径(头文件、库文件)
  • 几个容易混淆的目录
    • usr/include 头文件
    • usr/lib 库文件
    • usr/bin 可执行程序(Linux中又称命令)

gcc/g++编译C++程序时常用的环境变量有哪些?

Linux中用gcc或g++编译C++程序时常用的环境变量有哪些?
在Linux系统中,使用gcc或g++编译C++程序时,常用的环境变量主要有以下几个:

  1. PATH:这是最基本的环境变量之一,用于指定系统在哪些目录中寻找可执行程序。对于gcc和g++来说,它们的可执行文件通常位于/usr/bin目录下。因此,确保/usr/bin目录在PATH环境变量中是很重要的。这样,在终端中输入gcc或g++命令时,系统就能找到并执行这些程序。

  2. CCCXX:这两个环境变量分别用于指定默认的C语言编译器和C++编译器。虽然它们不是直接由gcc或g++命令使用时必需的,但在某些自动化构建系统或脚本中,可能会根据这些环境变量来选择编译器。如果你希望默认使用gcc作为C语言编译器,g++作为C++编译器,可以将它们分别设置为gccg++

  3. CFLAGSCXXFLAGS:这两个环境变量分别用于指定编译C程序和C++程序时的编译选项。通过设置这些环境变量,你可以为gcc和g++命令提供默认的编译选项,而无需在每次编译时都手动指定它们。例如,你可以设置CFLAGSCXXFLAGS来包含调试信息、优化级别等。

  4. LD_LIBRARY_PATH:这个环境变量用于指定动态链接器在运行时搜索共享库(.so文件)的额外路径。如果你的程序依赖于非标准路径下的共享库,那么设置LD_LIBRARY_PATH可以帮助系统找到这些库。需要注意的是,LD_LIBRARY_PATH主要用于运行时库搜索,而不是编译时。编译时可以通过gcc或g++的-L选项来指定库文件的搜索路径。

  5. LIBRARY_PATH:这个环境变量在某些情况下用于指定链接器(ld)搜索静态库(.a文件)的路径。然而,在现代Linux系统中,它可能不是必需的,因为链接器通常会搜索/lib/usr/lib等标准路径。如果需要链接非标准路径下的静态库,建议直接使用gcc或g++的-L选项来指定搜索路径。

  6. C_INCLUDE_PATHCPLUS_INCLUDE_PATH:这两个环境变量分别用于指定C和C++编译器搜索头文件的额外路径。虽然gcc和g++命令本身提供了-I选项来指定头文件搜索路径,但设置这些环境变量可以作为一种全局或默认的方式来实现相同的目的。

VSCode 中F12无法打开#include中的头文件

vscode提示can not open source file xxx/xxx.h
解决办法:

  • 检查#include中的头文件路径是否正确。
  • 配置 c_cpp_properties.json 让 VSCode 能够正确智能感知、检查编译错误:
    • 为VSCode安装C/C++ 扩展插件;
    • Ctrl+Shift+P 输入 C/C++: Edit Configurations (UI)并打开;
    • 在配置界面中,找到 Include path 部分,并添加你的头文件所在的目录。
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52288.shtml

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

相关文章

fiddler在软件测试中的使用(详细版)

1.抓包&#xff0c;辅助定位bug&#xff08;web中类似谷歌浏览器F12开发调试工具&#xff09; 合格的软件测试工程师&#xff0c;不仅仅需要能够发现bug&#xff0c;还需要能透过bug表象&#xff0c;分析出问题根本原因&#xff0c;从而提升bug的解决效率&#xff0c;通过fidd…

手机使用技巧:如何恢复Android手机不见的短信

在您的 Android 手机上丢失短信可能是一种令人沮丧的经历&#xff0c;尤其是在文本包含重要信息的情况下。幸运的是&#xff0c;有一些方法可以在Android上恢复已删除的短信。在这篇博文中&#xff0c;我们将讨论几种在Android手机上恢复已删除短信的方法。 为什么需要恢复Andr…

vue2版本空目录下创建新项目的方法2024

vue2版本空目录下创建新项目的方法2024 node -v npm -v vue -V 安装vue-cli 2.9版本的命令 npm install vue-cli -g 卸载vue2.x方法&#xff1a; npm uninstall vue-cli -g 设置 NPM 镜像 npm config set registry https://registry.npmmirror.com vue -V 报错时需设置环…

JVM的内存模型和垃圾回收

JVM内存区域 内存模型图&#xff1a; 堆 线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。 它的目的是存放对象实例。同时它也是GC所管理的主要区域&#xff0c;因此常被称为GC堆&#xff0c;又由于现在收集器常使用分代算法&#xff0c;Java堆中还…

【Spring Cloud】Consul

官网介绍: Spring Cloud Consul该项目为Spring Boot应用程序提供了与Consul的集成,通过自动配置和绑定到Spring环境以及其他Spring编程模型习语。通过几个简单的注解,您可以在应用程序内部快速启用和配置常见模式,并使用基于Consul的组件构建大型分布式系统。提供的模式包括…

【网络编程】第十一章 数据链路层 - 以太网(MAC+MTU+ARP+MSS+RARP)

文章目录 重点链路层以太网MAC帧格式碰撞域MAC地址MAC地址和IP地址 MTU-最大传输单元MTU 对 IP 的影响MTU 对 UDP 的影响MTU 对 TCP 的影响-MSS ARP协议ARP协议的工作流程ARP请求的过程ARP应答的过程 ARP 缓存中间人攻击 RARP协议 重点 数据链路层的作用&#xff1a;两个设备 …

虚幻5|AI视力系统,听力系统,预测系统(2)听力系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;1&#xff09;视力系统-CSDN博客 一&#xff0c;把之前的听力系统&#xff0c;折叠成函数&#xff0c;复制粘贴一份改名为听力系统 1.小个体修改如下&#xff0c;把之前的视力系统改成听力系统 2.整体修…

解决Jasper Studio预览无数据源的问题:在Dataset and Query里面预览数据为空,但是浏览器访问接口,是存在数据的。

目录 1.1、错误描述 1.2、解决方案 1.1、错误描述 最近接触Jasper Studio报表开发比较多一些&#xff0c;遇到了很多的问题&#xff0c;其中有一个问题就是&#xff1a;在Jasper Studio中的Dataset and query里面预览数据&#xff0c;发现是空的&#xff0c;如下图所示&…

数据仓库ETL开发

在企业数字化转型的过程中&#xff0c;数据仓库已经成为了企业管理和决策的重要工具。数据仓库ETL开发是构建数据仓库的关键步骤之一&#xff0c;它可以帮助企业从源系统中抽取、清洗、转换和整合数据&#xff0c;方便企业进行管理和分析。本文将介绍如何高效实现数据仓库ETL开…

Spring底层机制环境搭建

文章目录 1.模块创建和依赖引入1.聚合模块&#xff0c;下面有一个myspring2.查看父模块是否管理了子模块3.myspring模块引入基本包 2.进行环境搭建1.目录概览2.UserController.java3.UserService.java4.UserDao.java5.AppMain.java6.beans.xml7.测试8.配置UserController.java为…

掌握电子邮件的艺术:使用 Mailbird 统一管理您的数字生活

在数字时代&#xff0c;电子邮件已成为我们沟通的骨干。无论是商务交流、家庭联络&#xff0c;还是订阅更新&#xff0c;我们几乎每天都在使用电子邮件。但随着账户数量的增加&#xff0c;管理这些账户变得日益复杂。如何有效地整合和优化您的电子邮件体验&#xff1f;Mailbird…

【PaperInFive-时间序列预测】TSMixer:用于时间序列预测的全MLP架构(谷歌)

全文总结&#xff1a;本文研究了线性模型用于时间序列预测的能力&#xff0c;提出了时间序列混合器(TSMixer)&#xff0c;一种通过堆叠多层感知器(mlp)设计的新架构。TSMixer在时间和特征维度上交替应用mlp&#xff0c;在概念上对应于时间混合和特征混合操作&#xff0c;有效地…

AI开发者大赛 | 6道算法赛题上新

2024 AI开发者大赛正在如火如荼地进行着&#xff0c;本届比赛吸引了全球范围内的众多优秀开发者参与其中&#xff0c;用代码书写未来&#xff0c;用算法改变世界。 如今&#xff0c;算法赛新一批赛题上线&#xff0c;无论是初学者还是资深开发者&#xff0c;你都可以在2024 AI…

ClickHouse集群的安装

目录 1.clickhouse中文文档地址 2.centos安装部署 2.1采用tgz的方式安装 2.2修改配置文件 2.3修改数据目录 2.4创建角色和目录 3 集群安装 3.1配置文件修改 3.2启动zookeeper 3.3启动clickhouse-server 3.4任意节点连接clickhouse 3.5查看集群 3.6建库 3.7查看数…

了解住宅代理和移动代理的工作原理:从基础到高级应用

在当今时代&#xff0c;代理技术已经成为了优化网络连接、提升数据安全和增强用户体验的重要工具。特别是住宅代理和移动代理&#xff0c;这两种代理类型在网络服务中扮演着越来越重要的角色。本文将从详细的为您介绍这两种代理服务的工作原理&#xff0c;帮助你更好地理解并应…

如何对 GitLab 中文版进行升级?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

ArcGIS空间自相关 (Global Moran‘s I)——探究人口空间格局的20年变迁

先了解什么是莫兰指数&#xff1f; 莫兰指数&#xff08;Morans I&#xff09;是一种用于衡量空间自相关性的统计量&#xff0c;即它可以帮助我们了解一个地理区域内的观测值是否彼此相关以及这种相关性的强度和方向。 白话版&#xff1a;一句话就是判断数据在空间上有没有自…

Prometheus 和 Grafana 通过nginx-exporter监控nginx

在生产环境下&#xff0c;您已经部署了 Prometheus 和 Grafana&#xff0c;并希望通过它们来监控另一台 Ubuntu 20.04 上的 Nginx 服务。以下是配置步骤&#xff1a; 1. 安装和配置 nginx-exporter (Nginx 的 Prometheus 导出器) nginx-exporter 是 Prometheus 用来从 Nginx …

【机器学习-监督学习】逻辑斯谛回归

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)

VGG16模块的可视化 VGG16简介&#xff1a; VGG是继AlexNet之后的后起之秀&#xff0c;相对于AlexNet他有如下特点&#xff1a; 1&#xff0c;更深的层数&#xff01;相对于仅有8层的AlexNet而言&#xff0c;VGG把层数增加到了16和19层。 2&#xff0c;更小的卷积核&#xff01;…