调用其他文件中的函数
add_library可以生成我们所需的动态库或者静态库,我们要把制作出的库文件发布出去供第三方使用
一些函数方法单独在一个cpp的源文件中定义,然后在另一个源文件中需要用到自定义的函数时直接调用就可以了!
方法1.学过c++的人可能最熟悉的方法还是利用头文件来进行调用
1.首先创建一个method.h头文件,声明一个求最大值的函数max(int x,int y),
然后再创建一个同名的源文件method.cpp,在该文件中实现函数max(int x,int y)的功能
2.一个主函数的源文件,包含定义函数的头文件
并在主函数中调用函数
3.cmake
add_executable(main src/main.cpp src/method.cpp)
或者
add_library(method src/method.cpp)
add_executable(main src/main.cpp )
add_lin_libraries(main method)
本质时执行了g++
target_link_libraries链接名为myapp的可执行文件和名为mylib的库时,可能会生成类似以下形式的链接行:
g++ main.o -o myapp -L/path/to/lib -lmylib
方法2:调用前声明函数
在c语言中有介绍过,就是不用创建头文件,
1.直接在method.cpp源文件中定义并实现好max函数后,在主函数文件中调用max函数前声明一下就可以
声明后调用
2. add_executable(main src/main.cpp src/method.cpp)
自己使用
静态库不是系统提供的(自己制作或者使用第三方提供的静态库如下命令指定要链接的库路径
link_directories(<lib_path>)
应该尽量避免 link_directories,实在无法避免使用绝对路径增加工程的可移植性。
绝对路径可以配合 find_library()+ target_link_libraries()
cmake 中,链接静态库的命令如下:
link_libraries(<static lib> [<static lib>...])
如果在生成可执行文件时,链接的是静态库, 这个静态库文件会打包到可执行文件app中。
如果链接的是动态库里面的数据就不会打包到可执行文件中。当可执行程序被启动并且调用了动态库中的函数的时候,动态库才会被加载到内存
cmake 中指定要链接的动态库的时候,应该将命令写到生成了可执行文件之后
target_link_libraries 不仅可以链接动态库,静态库也可以用它来链接
对于库的使用者, 只要拿到了头文件和库文件,就可以调用这个库了
C++动态库函数同名冲突
1.c++也可以通过增加命名空间来解决冲突
2.
01. static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用
02. 编译器根据链接先后顺序,依次查找链接库
且加载的顺序是由编译时链接的顺序决定的。这也就说符号会以第一个查找到的为准(Symbols are resolved on a first match basis
03. dlopen函数族,显式指定要调用的动态库
C++
C++中函数同名的情况有三种:重载(overload),覆盖(override)和隐藏
重载:函数名相同,参数不同。重载函数处于同一个范围,比如同一个类中
函数处于基类和派生类中 派生类的成员函数对基类成员函数的重新定义。这种关系的函数前面要加关键字virtual
数据类型
简洁-高效-可移植
确定的 依赖于实现的 依赖于编译器的 不确定的
char字符类型只有8个位,只能包含256个字符,而像很多外文字符远超过256个字符,例如:中文、日文、韩文等,这些字符需要占用两个字节空间,
所以c++提出了双字节字符类型 wchar_t (或叫宽字符类型)。
int 无论在32位还是64位机器中,都是4个字节, 且带符号
int_t 是通过typedef定义的,t表示typedef,因为跨平台,不同的平台会有不同的字长,所以利用预编译和typedef可以最有效的维护代码
typedef unsigned int uint32_t;
typedef int int32_t;
typedef unsigned long int uint64_t;
typedef long int int64_t;
int64_t和long long都是整型数据类型,它们都可以存储整数值。
不过int64_t是一种专门为64位系统设计的数据类型,它的长度固定为64位。相比之下,long long的长度并不是固定的,在不同的编译器和操作系统上可能会有所不同
通过typedef定义的,而不是一种新的数据类型
typedef
指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性
使用:
用途一:定义一种类型易于记忆的别名
用途三:用typedef来定义与平台无关的类型
当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。标准库就广泛地使用这种技巧来创建平台无关类型
#define只是简单的字符串替换而typedef则是为一个类型起新名字
#define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义
声明-定义-初始化
声明-赋值-初始化
输出
头文件:<locale>
2
setlocale(LC_ALL, "chs"); // 设置为中文格式
cout 对应char型字符串, wcout对应 wchar_t型字符串
#include <locale> // 本地语言设置头文件
wcout.clear();
setlocale(LC_ALL, "chs"); // 设置为中文环境
参考
c++在一个cpp文件中调用另一个cpp文件的函数的两种方法 https://blog.csdn.net/weixin_43350361/article/details/106455331
c++学习之wchar_t字符类型 https://www.cnblogs.com/alex-space/p/13131526.html
标签:typedef,调用,函数,int,数据类型,C++,调用函数,cpp,链接
From: https://www.cnblogs.com/ytwang/p/17880209.html