ardupilot开发 --- C嘎嘎 篇

news2024/11/24 6:38:12

在这里插入图片描述

无情的猜猜猜又卜了一挂

  • cout和cin的使用,标准输入输出
  • << 和 >> 的使用
  • 数据类型(函数)模板的使用:
  • 命名空间的使用,std命名空间
  • 语句块
  • new 的使用
  • 引用 &
  • 共用体union
  • 类对象的赋值:operator函数
  • Linux中的C++编译器
      • 1. GNU Compiler Collection (GCC)
      • 2. Clang
      • 3. Intel C++ Compiler (ICC)
      • 4. Turbo C++ Compiler
      • 总结
  • Ubuntu C++程序中执行shell命令
  • #include<> 和 #include" "
  • gcc/g++编译C++程序时常用的环境变量有哪些?

小生之前拥有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);

}

Linux中的C++编译器

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

1. GNU Compiler Collection (GCC)

特点

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

2. Clang

特点

  • 前端:Clang是LLVM项目中的一个C/C++/Objective-C编译器前端,具有速度快、占用内存少的特点。
  • 静态分析:Clang提供了强大的静态分析能力,可以帮助开发者在编译阶段发现潜在的错误。
  • 模块化:Clang的设计更加模块化,易于维护和扩展。
  • 跨平台:Clang同样支持多种操作系统和体系结构。

3. Intel C++ Compiler (ICC)

特点

  • 优化性能:ICC是英特尔公司开发的C++编译器,具有出色的优化性能,特别是在Intel处理器上,能够生成更高效率的代码。
  • 向量化:ICC支持自动向量化,可以显著提高循环等操作的执行效率。
  • 调试支持:ICC提供了丰富的调试信息和工具,帮助开发者更好地理解和优化代码。

4. Turbo C++ Compiler

特点

  • 历史背景:Turbo C++是Borland公司早期推出的一个C++编译器,虽然它主要在Windows环境下使用,但在Linux下通过WINE等工具也可以运行。
  • 集成开发环境:Turbo C++提供了一个较为完整的集成开发环境(IDE),方便开发者进行代码编写、编译和调试。
  • 学习用途:由于其简单易用的特点,Turbo C++曾一度被用作C++语言的教学工具。

总结

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

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

文言一心
待续…

#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++编译器之一;
GCC自带了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;

通过编译器选项来指定头文件搜索路径:gcc -I
通过环境变量 CPLUS_INCLUDE_PATH 来额外指定头文件搜索路径;
通过pkg-config工具来获取已安装的第三方库、标准库的安装路径;

<> C++标准库中的头文件时,应该使用尖括号。例如,包含输入输出流库、字符串库、容器库如等。
" "
注意,#include<>、" "的搜索路径与环境变量PATH无关。PATH用于在Linux中指定在哪些目录中寻找可执行程序,便于让你在任何目录下都能执行已安装的程序而不需要加上绝对路径。

cmake中如何处理#include<>?
make的底层调用的是gcc吗?是的。
几个容易混淆的目录
usr/include 头文件
usr/lib 库文件
usr/bin 可执行程序(Linux中又称命令)

pkg-config查找某库的安装路径(头文件、库文件)

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选项来指定头文件搜索路径,但设置这些环境变量可以作为一种全局或默认的方式来实现相同的目的。

需要注意的是,虽然上述环境变量在Linux系统中是常用的,但它们并不是必须设置的。在大多数情况下,你可以通过gcc或g++命令的命令行选项来指定编译和链接时所需的各种参数和路径。然而,在某些特定场景下(如自动化构建、跨平台编译等),合理使用这些环境变量可以提高编译的灵活性和效率。

此外,为了确保环境变量的设置生效,你可能需要在你的shell配置文件中(如~/.bashrc~/.bash_profile/etc/profile等)添加相应的export语句,并使用source命令重新加载配置文件,或者在新的shell会话中查看更改是否生效。

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

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

相关文章

实现 FastCGI

CGI的由来&#xff1a; 最早的 Web 服务器只能简单地响应浏览器发来的 HTTP 请求&#xff0c;并将存储在服务器上的 HTML 文件返回给浏 览器&#xff0c;也就是静态 html 文件&#xff0c;但是后期随着网站功能增多网站开发也越来越复杂&#xff0c;以至于出现动态技 术&…

仿Muduo库实现高并发服务器——Connection模块

这个模块看着代码挺多的实则真的很多&#xff0c;但是不难&#xff0c;我为大家将各个函数拿出来理一理。 connection就是将主线程监听的网络套接字上的客户端套接字进行包装&#xff0c;使被包装的套接字可以进行&#xff0c;各种事件的处理&#xff0c;比如读写事件。下面就来…

3D场景标注标签信息,three.js CSS 2D渲染器CSS2DRenderer、CSS 3D渲染器CSS3DRenderer(结合react)

如果你想用HTML元素作为标签标注三维场景中模型信息&#xff0c;需要考虑定位的问题。比如一个模型&#xff0c;在代码中你可以知道它的局部坐标或世界坐标xyz&#xff0c;但是你并不知道渲染后在canvas画布上位置&#xff0c;距离web页面顶部top和左侧的像素px值。自己写代码把…

探秘黑魔术玫瑰:花语与魅力的交织

一、黑魔术玫瑰的花语解读 黑魔术玫瑰的花语丰富而深邃&#xff0c;充满了神秘与诱惑。在许多文化中&#xff0c;其深沉的颜色被赋予了神秘的象征意义&#xff0c;代表着那些尚未被揭示的秘密和未知的领域。它仿佛是隐藏在黑暗中的谜题&#xff0c;吸引着人们去探索和追寻。 禁…

plsql表格怎么显示中文 plsql如何导入表格数据

在Oracle数据库开发中&#xff0c;PL/SQL Developer是一款广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了丰富的功能来帮助开发人员高效地进行数据库开发和管理。在使用PL/SQL Developer时&#xff0c;许多用户会遇到表格显示中文的问题&#xff0c;以…

DRF——请求的封装与版本管理

文章目录 django restframework1. 快速上手2. 请求数据的封装3. 版本管理3.1 URL的GET参数传递&#xff08;*&#xff09;3.2 URL路径传递&#xff08;*&#xff09;3.3 请求头传递3.4 二级域名传递3.5 路由的namespace传递 小结 django restframework 快速上手请求的封装版本…

SQL,解析 json

Google BigQuery数据库的data表存储了若干多层的Json串&#xff0c;其中一条形如&#xff1a; [{"active":true,"key":"key1","values":[{"active":true,"value":"value1"}]},{"active":tru…

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 &#xff08;一&#xff09;分布式锁&#xff1a;应对分布式环境的同步挑战 &#xff08;二&#xff09;分布式锁的实现方式 &#xff08;三&#xff09;分布式锁的使用场景 &#xff08;四&#xff09;分布式锁需满足的特点 二、Redis 实现分…

Golang | Leetcode Golang题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; import "math/rand"type node struct {ch [2]*nodepriority intval int }func (o *node) cmp(b int) int {switch {case b < o.val:return 0case b > o.val:return 1default:return -1} }func (o *node) rotate…

算法日记day 44(动归之编辑距离|回文字串|最长回文子序列)

一、编辑距离 题目&#xff1a; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "…

WEB渗透免杀篇-cshot远程shellcode

往期文章 WEB渗透免杀篇-免杀工具全集-CSDN博客 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀…

基于.net技术的物业管理系统需求分析与设计

系统需求分析 2.1 整体需求概述 根据某XXXXXXXX管理公司实际业务调研分析&#xff0c;可将其系统需求划分为7个部分&#xff1a;基础信息维护、网上报修、权限管理、动力消耗、物料管理、收费管理、报表分析。 2.1.1 基础信息维护 基础信息维护包括对以下业务基础数据的采集…

linux驱动——设备树

1&#xff1a;初识设备树 1.1 什么是设备树&#xff0c;设备树的意义 设备树&#xff08;Device Tree&#xff09;是 Linux 内核中用于描述硬件设备的一种数据结构。它为操作系统提供了一种抽象的方法&#xff0c;使其能够识别和配置硬件设备&#xff0c;而无需将硬件细节硬编…

QT-五子棋游戏

QT-五子棋游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "GameModel.h" #include <time.h> #include <stdlib.h>GameModel::GameModel(){}void GameModel::startGame(GameType type){gameType type;//初始化棋盤game…

【备忘录模式】设计模式系列:掌握状态回溯的艺术(设计详解)

文章目录 备忘录设计模式详解引言1. 设计模式概述2. 备忘录模式的基本概念2.1 备忘录模式的定义2.2 备忘录模式的关键角色 3. 备忘录模式的实现原理3.1 备忘录模式的工作流程3.2 模式的优缺点分析3.3 与其他模式的对比 4. 实际案例分析4.1 游戏状态保存与恢复4.2 文档编辑器撤销…

19529 照明灯安装

### 详细分析 这个问题可以通过二分查找和贪心算法来解决。我们需要找到一个最大值&#xff0c;使得在这个最大值下&#xff0c;能够在给定的坐标上安装 k 个照明灯&#xff0c;并且相邻的照明灯之间的距离至少为这个最大值。 ### 思路 1. **排序**&#xff1a;首先对给定的…

S3C2440中断处理

一、中断处理机制概述 中断是CPU在执行程序过程中&#xff0c;遇到急需处理的事件时&#xff0c;暂时停止当前程序的执行&#xff0c;转而执行处理该事件的中断服务程序&#xff0c;并在处理完毕后返回原程序继续执行的过程。S3C2440提供了丰富的中断源&#xff0c;包括内部中…

微信小程序:开发工具修改js编译后还是旧的js逻辑

1、清理所有缓存&#xff0c;重新导入项目 2、语法存在问题无法编译,导致内存堆积&#xff0c;无法自动编译 3、npm 存在问题&#xff0c;可以重新构建 4、有时候编译器也没报错都是一切正常&#xff0c;但是编译后依然不是最新。这个时候需要考虑下电脑是否存在问题&#xff0…

使用gitee存储项目

gitee地址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台 创建gitee远程仓库 将远程仓库内容拉取到本地仓库 复制下面这个地址 通过小乌龟便捷推送拉取代码&#xff1a;https://blog.csdn.net/m0_65520060/article/details/140091437

Ubuntu | 解决 VMware 中 Ubuntu 虚拟机磁盘空间不足的问题

目录 一、存在的问题二、解决的步骤第一步&#xff1a;扩展磁盘空间第二步&#xff1a;查看磁盘空间使用情况第三步&#xff1a;安装分区工具第四步&#xff1a;启动分区工具第五步&#xff1a;修改挂载文件夹的读写权限第六步&#xff1a;扩展文件系统大小第七步&#xff1a;验…