C++_基于例子进行学习

1.C++ example learning

first example--》
1. include
#include指令:头文件包含指令。预处理阶段,#include会将头文件拷贝到本文件内进行运行

 <string.h> 是旧的C头文件,对应的是基于char*的字符串处理函数;
 <string> 是包装了std的C++头文件,对应的是新的strng类;
 <cstring> 是对应旧的C头文件的std版本。
02.#include <xxx.h>

03.#include “xxx.h”

附录:
   头文件的系统目录:
      -/usr/include
      -/usr/local/include
      -/usr/lib/gcc/i686-linux-gnu/4.6.3/include

2.   using namespace std;	
   作用域运算符(::)
   
 01.标注库名空间和自定义名空间
   当第三方供应商提供的库时,为了避免与其他供应商或者用户定义的名字相冲突(命名空间污染),
  常常将库的内容放置在自己独立的命名空间中。
    std:就是C++标准程序库中定义所有标识符的namespace。  
  名空间定义了一组变量和函数,它们具有相同的作用范围。
  对于不同的名空间,可以定义相同的变量名或函数名,
  在使用的时候,只要在变量名或函数名前区分开不同的名空间就可以了
 自定义名空间
    显式具名   命名空间
    隐式不具名 命名空间
02.访问命名空间	
  using namespace std;
  当不使用using namespace std的时候,直接使用cout编译器会不识别,会产生报错:
    “error: ‘cout’ was not declared in this scope"和"error: ‘endl’ was not declared in this scope”
    要加上命名空间std::才可以使用!
03.cout和endl实际上是C++中的标识符,使用using namespace std;时,可以直接使用cout等标识符

3.编译库
  GCC typically has the standard C++ headers installed in /usr/include/c++/<version>/. 
   You can run gcc -v to find out which version you have installed.	

代码示例

// Your First C++ Program
#include <iostream>
using namespace std;

int main() {
    std::cout << "Hello World!";
    return 0;
}

C++

 C++标准库由三组库构成:C++标准库所有的头文件都没有扩展名(.h),内容总共在51个标准头文件中定义。
   (1)C库:由C标准库扩展而来,强调结构、函数和过程,不支持面向对象技术。
   (2)C++库:增加了面向对象的库,包含了既有关键功能的类
   (3)标准模板库(STL):高效的C++程序库。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。
   以上库文件都被定义在namespace std 中
   
     <string>
   03.STL被组织为以下13个头文件:
	 <algorithm>,<deque>,<functional>,<iterator>,
	 <vector>,<list>,<map>,<memory>,<numeric>,<queue>,<set>,<stack>,和<utility>。
  1.#include <iostream>  //(input&output stream) 

源文件

  编写-调试-编译

头文件和源文件

 C++支持“分别编译”(separate compilation) C++程序中,只包含两类文件——.cpp文件和.h文件
   调用“void a()”函数之前,先声明一下这个函数“void a();	 
   头文件中应该只放变量和函数的声明,而不能放它们的定义
      头文件中可以写const对象的定义。因为全局的const对象默 认是没有extern的声明的,所以它只在当前文件中有效
	  头文件中可 以写内联函数(inline)的定义。因为inline函数是需要编译器在遇到它的地方根据它的定义把它内联展开的,而并非是普通函数那样可以先声明再链 接的(内联函数不会链接), 
	      所以编译器就需要在编译时看到内联函数的完整定义才行。
	 头文件中可以写类(class)的定义
 头文件的保护措施--namespace 定义也可以使用这种保护措施
    通过#define定义一个名字,
	并且通过条件编译#ifndef…#endif使得编译器可以根据这个名字是否被定义,
	再决定要不要继 续编译该头文中后续的内容
  #ifndef的作用:防止多个源文件同时包含同一个头文件时产生的声明冲突。

头文件和库文件--

库文件-命名-制作-调用或使用
 编译后生成 可执行文件--
 编译后生成 库文件--
  含有main()函数的文件会被生成可执行程序。而那些不含main()函数的代码,编译后一般是被其他程序调用,
  因此我们可以把他们打包成一个“东西”,即为库(Library)。
 add_library()的意思就是将helloWorld.cpp封装成静态库,加上SHARED就是生成共享库
 编译后一般是被其他程序调用
 静态库是将代码嵌入到使用程序中,多个程序使用时会有多份代码,所以代码体积会增大。
 动态库的代码只需要存在一份,其它程序通过函数地址使用,所以代码体积小

库文件是一个压缩包,里面有编译好的二进制函数,如果仅有.a或者.so库文件,那么我们并不知道里面的函数是什么,调用的形式三怎样的。为了让别人使用这个库,我们需要一个头文件,
  说明这个库里都包含了什么。因此只要拿到了头文件和库文件,就可以调用这个库
 区别是:静态库在程序的链接阶段被复制到了程序中;
         动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
库的好处:代码保密 和 方便部署和分发 
  
头文件不如说是提前定义好了一些函数声明,而具体定义在库文件中

使用示例
   windows
      使用动态库需要有 .dll 文件和对应的 .lib 文件,
         其中 .lib 不是静态库-动态库编译链接后,也会生成 LIB 文件作为动态库函数映射使用,通过 LIB 文件可以链接到动态库	
   Linux 
       add_library( hello_shared SHARED libHelloWorld.cpp )
   	输出:   hello_shared.so

静态库命名规则

 对于Linux 平台的话,一般为:libxxx.a
  lib :固定前缀
  xxx :自定义的名称
   .a :固定后缀
 例如有一个静态库的名称:libhello.a
 
 对于Windows 平台的话,一般为:libxxx.lib
 lib :固定前缀
 xxx :自定义的名称
 .lib:固定后缀

动态库命名规则

对于Linux 平台的话,一般为:libxxx.so
 lib :固定前缀
 xxx :自定义的名称
 .so :固定后缀
 例如有一个静态库的名称:libhello.a
 
 对于Windows 平台的话,一般为:libxxx.dll
 lib :固定前缀
 xxx :自定义的名称
 .dll:固定后缀

G++

-l 是指定链接库的名字,而-L 表示在哪个地方去找库,-I表示的是头文件引用的位置
   # 生成动态库 swap.so
    g++ swap.cpp -Iinclude -fPIC -shared -o libswap.so
   # 以上指令等价于
   # gcc swap.cpp -Iinclude -c -fPIC
   # gcc -shared -o libswap.so swap.o
   
   # 链接动态库生成main
   g++ -o main.cpp -Lsrc -lswap main
   
   # 运行 main,要将动态库所在路径添加到参数
   LD_LIBRARY_PATH=src ./main


 输入以下命令得到hello.o文件
   # gcc -c hello.c
   同理理编译main.c
   # gcc –c main.c
   将两个文件链接成一个.o文件
   # gcc hello.o main.o –o hello
   运行
   ./hello

-fPIC/fpic	生成与位置无关的代码
-shared	生成共享目标文件,通常用在建立共享库时
-std	指定C方言,如:-std=c99,gcc默认的方言是GNU C	

Cmake

   # 生成动态库hello_shared
   add_library( hello_shared SHARED libHelloWorld.cpp )
   
   #正常对useHello.cpp文件进行编译
   add_executable( useHello useHello.cpp )
   
   #建立与库文件的链接(注意!添加的是库文件的名称,不是头文件的名称)
   target_link_libraries( useHello hello_shared )

可执行程序

ldd  命令可以查看一个可执行程序依赖的共享库	
 LD_LIBRARY_PATH 后面跟的是动态库的绝对路径	
    LIBRARY_PATH is used by gcc before compilation to search for directories containing libraries that need to be linked to your program.
 LD_LIBRARY_PATH is used by your program to search for directories containing the libraries after it has been successfully compiled and linked.

两者的差异点是使用时间不一样。一个是编译期,对应的是开发阶段,如gcc编译;一个是加载运行期,对应的是程序已交付的使用阶段

八股文

 作息大概是怎么样的呢
工作节奏大概是什么样子呢?比如说每天什么时候上班,什么时候下班呢
在***工作,如果满分是10分的话你会给到多少的幸福指数?

参考

Linux下C/C++编程开发(二)静态库和动态库  https://blog.csdn.net/m0_46201544/article/details/127050083
小林 x 图解计算机基础 https://xiaolincoding.com/
http://wiki.ros.org/catkin/commands  catkin_init_workspace  catkin_create_pkg catkin_make
C++ 标准库头文件汇集 https://blog.csdn.net/qq_44681788/article/details/126317995
Standard C++ Library reference  https://cplusplus.com/reference/ 
https://cplusplus.com/site/versions/
https://app.programiz.pro/course/learn-cpp-basics/get-started
posted @ 2022-12-16 11:34  辰令  阅读(58)  评论(0编辑  收藏  举报