首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++の函数——内联函数&函数指针

所谓内联函数,其实本质上也是一种函数,在形式上表现就是在普通函数前面加上关键字"inline",然后相对于普通函数来说,它也比较短小。...如何定义内联函数 定义内联函数就要在函数前面使用“inline”关键字。...4、内联函数通过使用指令缓存来增加引用局部性 5、通过将其标记为内联,您可以将函数定义放入头文件中 缺点: 1、由于代码扩展,增加了可执行文件大小 2、c++内联在编译解决。...这意味着如果您更改内联函数代码,您将需要使用它重新编译所有代码,以确保它将被更新 3、当在头文件中使用时,它会使头文件变大,包含用户不关心信息 4、如上所述,增加了可执行文件大小,这可能会导致内存抖动...重载函数指针 前面我们说到了函数重载,就是说在同一个文件中函数具有相同名字,但是具有不同参数列表情况,因此我们很容易延伸到函数指针里面,就是这里要说重载函数指针。

2.4K21

【Linux】编译器-gccg++使用

在用gcc时候有一个选项-o,后面接一个名称,就是把编译可执行程序再起一个名字: gcc test.c -o my.exe -std=c99 -o也可以放在前面,但是-o紧跟就是修改文件名 gcc...如果想要编译一个指定名称c++程序,怎么写呢?...那么给它加上可执行权限: 发现还是不能运行 一个文件能不能被指向,不止取决于权限,还要本身就是可执行程序。 得明白二进制目标文件一个临时文件,是不能够执行。...我们可以看看这个库大小: ls /lib64/libc-2.17.so -l 一般进行链接是把程序和这个库链接形成一个可执行程序。...小明在这个网吧(就相当于动态库)9号机(相当于库里面的一个方法,printf),小明在学校里面作业(程序执行代码)想要用到电脑,去了网吧(跳转到库)9号机(想要方法),用完之后回学校(返回程序

14810
您找到你想要的搜索结果了吗?
是的
没有找到

【Linux】软硬链接与动静态库

当然,假如我们将源文件删除或者改变源文件路径后,那么软链接文件也就运行不了,因为软链接文件内仅仅只是源文件所在路径,文件不在,软链接文件也就“失效了”。...当然,假如此时我们将源文件路径给更改,并不会发生什么影响,但是假如我们将源文件给删除。我们会发现,那个数字就会由2变成1,但依然可以运行。 接下来我们一个现象:为什么目录文件硬链接数为2?  ...动静态库 什么是库文件我们在编写C/C++代码,实际上一直都在用库(c/c++标准库),在编写代码,有很多库函数诸如printf等,我们为什么能直接拿来用呢?...对于静态库使用,还有第二种方法如下: 第二种方式使用静态库:将头文件以及库文件安装在系统目录 由于gcc/g++在编译,会默认去系统目录搜索,进行路径匹配,这也是为什么我们平常用c/c++标准库,...同时假如存在多个进程同时运行且使用同一个库,那么动态库也只需要在内存中加载一份,然后映射到各自共享区,通过库地址+偏移量就可以跳转到方法实现。大大节省了空间使用。

19430

Linux基础——Linux开发工具(中)_gccg++

我们来进行一个简单测试: 如果我们想执行这个程序,我们可以: 指令:./a.out 注意:必须加上.才表示要在当前目录下找可执行文件。...函数库 函数库一般分为静态库和动态库两种: 静态库是指编译链接,把库文件代码全部加入到可执行文件中,因此生成文件比较大,但在运行时也 就不再需要库文件了。...其后缀名一般为.a 动态库与之相反,在编译链接并没有把库文件代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统开销。...动态库一般后缀名为.so,如前面所述 libc.so.6 就是动态 库。gcc 在编译默认使用动态库。...完成了链接之后,gcc 就可以生成可执行文件 我们可以用指令来查看一个可执行程序依赖库: 指令:ldd 可执行程序 因此,test可执行程序所依赖标准库在路径lib64里有一个文件叫libc.so

13810

【Linux】常用工具(上)

sl 命令,因为安装需要 root 权限,所以我们在安装要在前面加上 sudo,意思是使用 root 权限执行这条命令,如何才能使用 sudo 将会在后面介绍;如下图: 执行这条命令之后可能会让你输入当前用户密码...链接 链接是将 test.o 文件加上系统库生成可执行程序过程,其指令为 gcc test.o -o 可执行文件名,如下图: 上图中 mycode 就是一个可执行程序文件我们执行只需输入指令...上面的四个步骤就是我们程序翻译过程,但是我们平时想要执行一个程序时候并不需要分别执行上面的步骤,例如我当前目录下只有一个 .c 文件,如图: 我们当前可以直接将 test.c 文件直接生成可执行文件...,只需要执行指令 gcc test.c 即可,如下图: 系统默认生成可执行文件名称为 a.out ,我们想要执行时候,只需要在当前目录下找到直接执行即可,其指令为 ....,在编译链接并没有把库文件代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统开销。

15010

Linux开发工具——gcc篇

gcc -E xxx.c -o xxx.i#将原文件进行预处理,为了得到预处理后文件我们加上“-o”选项,得到目标文件   创建一个C文件:   对该文件进行编写:   将该文件进行预处理得到目标文件...我们可以使用 ldd 命令来查看对应可执行程序文件:   其实我们为什么可以直接运行C语言代码是因为我们在Linux平台下 已经安装了对应文件以及标准头文件!   ...动态库一般后缀名为 “.so”,如前面所述 libc.so.6 就是动态库。gcc 在编译默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件。...如果我们想要程序进行静态链接,生成目标文件需要加上 -static 选项,如果你系统下没有安装C/C++静态库可以使用这条指令安装: yum install -y glibc-static glibc-devel-static...一般我们编译C语言代码直接使用: gcc xxx.c -o 运行程序文件名#编译出来直接得到可执行程序 ✈️ 总结 普通用户想要进行sudo操作,需要root账号在sudoers文件里面将该普通用户进行对应设置

16010

【Linux】常用工具(下)

); 结果如下: 这时候就基本完成我们倒计时了,但是倒计时到个位数时候,前面空了一个字符,不太美观,这是因为 %2d 是默认右对齐,我们前面加上负号,就是左对齐了,所以我们继续修改: 9...下面我们 make 生成可执行程序,然后运行,观察结果: 加载完成后就是上图这样子。这是简单实现了一个进度条版本,下面我们进一步改进这个进度条。...必须在源代码生成二进制程序时候, 加上 -g 选项;如下我们在编辑 Makefile 文件,在建立依赖方法需要给可执行程序加上 -g 选项: 此时我们退出 Makefile,执行 make,然后对...ret 地址: 如果想要取消显示某个变量,可以使用 undisplay + 序号 即可,其中序号是 display 前面显示序号,如下: 当前就取消了 &ret 显示。...:until + number 运行到当前函数结尾:finish 从一个断点运行至下一个断点:c 查看调用堆栈:bt 更改变量值:set var + 改变量 = 改

18710

详解动态库和静态库

前言 在C、C++我们使用过标准库,比如在使用strerror、vector、string等,都只是调用了这些函数接口,这些都是需要具体实现。...让我们来看看C语言库: 将来运行程序,需要二进制文件和库文件 看下C++标准库: 在Linux系统中,.so结尾是动态库,以.a结尾是静态库; 在Windows中,.dll结尾是动态库,lib结尾是静态库....c文件可形成一个.o文件,将这些.o文件链接形成可执行文件,头文件一个手册,提供函数声明,告诉用户如何使用,.o文件提供实现,我们只需要补充一个main文件,调用头文件提供方法,然后和.o文件进行连接...为什么在搜索头文件时候仅指定路径呢?...动态库要在程序运行时候要找到动态库加载运行。静态库为什么没有这个问题?因为静态库在编译期间已经将库中代码拷贝到可执行程序内部了,加载和库就没有关系了。

10910

MinGW安装教程

在刚开始学 C语言 ,一般情况下所有代码都写在一个文件中,只要输入几个简单命令,就能用 MinGW 编译成可执行文件。...只相当于一个下载器,运行时,将会从 MinGW 官方服务器上下载真正 MinGW 安装管理器。 5.MinGW安装管理器安装程序——首页 ?...相信这是学编程大多数人,入门一个程序,所以这里也就不再赘述了。 D.将hello.c编译成可执行文件 ?...因为我们编译没有指定生成程序名,所以 MinGW 默认将程序命名为 a ,加上后缀名就是 a.exe 了。如果我们想在编译就指定生成程序名,就需要使用 gcc 命令 -o 选项了。...以后我们程序变复杂了,可能会在一个工作目录下编译出复数个程序,这时就必须用 -o 选项了,否则编译出程序都叫 a.exe ,会在生成互相覆盖掉。

3.5K10

MinGW 安装教程

在刚开始学 C语言 ,一般情况下所有代码都写在一个文件中,只要输入几个简单命令,就能用 MinGW 编译成可执行文件。...只相当于一个下载器,运行时,将会从 MinGW 官方服务器上下载真正 MinGW 安装管理器。...D.将hello.c编译成可执行文件 之前说过 MinGW 是命令行工具没有图形用户界面,所以编译操作需要在命令提示符中进行。...因为我们编译没有指定生成程序名,所以 MinGW 默认将程序命名为 a ,加上后缀名就是 a.exe 了。如果我们想在编译就指定生成程序名,就需要使用 gcc 命令 -o 选项了。...以后我们程序变复杂了,可能会在一个工作目录下编译出复数个程序,这时就必须用 -o 选项了,否则编译出程序都叫 a.exe ,会在生成互相覆盖掉。

1.6K10

【Linux】进程理解与学习Ⅲ-环境变量

这种写法错误) 假如我们想要保持一个变量内容,并用该变量名去定义另一个变量我们要在该变量名称前加上符号(比如我用myval内容去定义age,就要写成age=myval.其中 在定义变量前面加...这里举个例子:我们在编写C/C++代码时候,在链接时候,从来不知道我们所链接动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。...PATH : 指定命令搜索路径 SHELL : 当前Shell,值通常是/bin/bash。 USER:当前用户 PATH 我们在写完代码并编译,生成一个可执行程序时,为什么运行时候要加./?...实际上运行一个程序前提是找到该程序。只有找到,才能运行,而./含义大家应该知道,表示是当前所在路径。 那么为什么我们输入ls时候,则不用指定ls所在具体位置呢?...★总结 上面讲有些零碎,这里做一个总结: 【y=a】等号左边表示是变量名,右边表示变量内容 我们可以通过echo $变量名指令,来查看该变量内容 在定义变量前面加上export,则会将该变量导入环境变量表

92020

【Linux】动静态库

对于学习C/C++同学来说:听到最多就是标准库,其次就是库函数。但究竟什么是库呢?为什么我们只需要添加一下头文件,就可以使用库中包含函数了呢?别着急,通过本文,我们都会讲清楚。...一个与动态库链接可执行文件仅仅包含它用到函数入口地址一个表,而不是外部函数所在目标文件整个机器码 在可执行文件开始运行以前,外部函数机器码由操作系统从磁盘上该动态库中复制到内存中,这个过程称为动态链接...4.2动态库加载问题 采用动态库程序在使用库中方法,会在使用地方留下一个标记,在程序运行以后进行动态链接,会将这个标记替换为动态库中地址。...一个使用了动态库进程A运行起来以后在需要动态库a,操作系统会先在内存中搜寻a,是否存在,如果存在,就直接将a通过页表进行映射进进程A进程地址空间中共享区中,如果不存在就会将磁盘中动态库a加载进入内存...一个动态库,真正被映射进地址空间时候,起始地址才能真正确定! 此时动态库中方法地址就等于库地址加上自己在库中偏移量。

7410

c++动态库和静态库区别_静态库里面包含动态库

l 程序在运行时与函数库再无瓜葛,移植方便。 l 浪费空间和资源,因为所有相关目标文件与牵涉到函数库被链接合成一个可执行文件。.../StaticLibrary -lstaticmath l -L:表示要连接库所在目录 l -l:指定链接需要动态库,编译器查找动态连接库时有隐含命名规则,即在给出名字前面加上lib,后面加上...那么,在执行时候是如何定位共享库文件呢? 1) 系统加载可执行代码时候,能够知道其所依赖名字,但是还需要知道绝对路径。...冠以extern “C”限定符后,并不意味着函数中无法使用C++代码了,相反,仍然是一个完全C++函数,可以使用任何C++特性和各种类型参数。...:表示要连接库所在目录。 l -l:指定链接需要动态库。编译器查找动态连接库时有隐含命名规则,即在给出名字前面加上lib,后面加上.a/.so来确定库名称。

1.7K30

环境变量与命令行参数详解

\n"); sleep(1); } return 0; } ​ 我们将其运行编译并生成为可执行文件 myproc ,当我们运行时候,都得在这个可执行文件前面一个.../myproc ​ 我们再仔细想想以前接触到一些指令比如说 which、touch 等等命令,它们其实也是一些可执行文件,这个可以用 file 指令验证一下: ​ 那为什么都是可执行文件我们自己写...myproc 就要在前面加上 ./ 才能执行呢,而系统中指令则不用呢? ​...至于这里为什么要加 呢,因为 PATH 相当于 bash 是一个全局变量,所以用 echo 查看时候要加上 下面我们就来介绍一下环境变量! Ⅰ....下面介绍两个方法: 修改相关配置文件,但是对小白来说极其不推荐。系统登录成功后,系统会把各种需要脚本运行一下,然后我们就看到echo $PATH里内容了。

1.3K20

C++面试题

采用此链接方式生成可执行文件,可以独立载入内存运行; 动态链接,链接器先从所有目标文件中找到部分缺失地址,然后将所有目标文件组织成一个可执行文件。...如此生成可执行文件,仍缺失部分函数和变量地址,待文件执行时,连同所有的链接库文件一起载入内存,再由链接器完成剩余地址修复工作,才能正常执行。 4....构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象我们总是要明确指定对象类型,尽管我们可能通过实验室基类指针或引用去访问但析构却不一定,我们往往通过基类指针来销毁对象。...编译器为这个构造函数产生代码,它是为这个类构造函数产生代码——既不是为基类,也不是为派生类(因为类不知道谁继承)。所以使用VPTR必须是对于这个类VTABLE。...删除容器中一个元素后,该迭代器所指向元素已经被删除,那么也造成迭代器失效。erase方法会返回下一个有效迭代器,所以当我们要删除某个元素,需要it=vec.erase(it);。

1.7K42

12、动态链接库,dll

动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立文件,其中包含能被可执行程序或其它DLL调用来完成某项工作函数。只有在其它模块调用动态链接库中函数才发挥作用。...1、我们可以把完成某种功能函数放在一个动态链接库中,提供给其它函数调用。...在使用静态库情况下,在编译链接可执行文件,链接器从库中复制这些函数和数据并把它们和应用程序其它模块组合起来创建最终可执行文件。产品发布不需要发布被使用静态库。...在使用动态库情况下,在编译链接可执行文件,只需要链接该DLL引入库文件,该DLL中函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需DLL,将该DLL映射到进程地址空间中...同样,可以把上面定义DLL1加在一个前面,或类成员函数前面来把类或类成员函数导出。

78920

【Linux】进程概念(下)

我们平时在 Linux 中写一份代码,想要运行起来首先需要找到这个可执行程序路径,所以如果这个可执行程序在当前路径下,就需要在前面加上 ./ ,例如下图: 那么通过上面命令行参数学习,我们知道,Linux...中指令也是可执行程序,那么为什么它们指令不用加 ./ 就能正常运行呢?...此时我们路径也就添加到 PATH 中了,我们可以查看一下: 如上图,我们确实将路径添加到了 PATH 中;那么我们现在执行当前路径下可执行程序时就不用在前面加上 ./ 了;如下图: 如果我们想删除当前路径呢...进程地址空间 首先我们回顾一下我们以前学习 fork 时候,父子进程之间是怎么运行我们这时候想起来还有一个问题还没解决,那就是子进程修改代码,会发生写拷贝,但是一个变量不同为什么会有相同地址呢...g_val,子进程对进行修改时,父进程还是原来 g_val,因为父子进程之间数据互不影响,具有独立性;我们观察运行结果会发现,它们地址竟然是一样

15510

MinGW安装教程——著名CC++编译器GCCWindows版本

在刚开始学 C语言 ,一般情况下所有代码都写在一个文件中,只要输入几个简单命令,就能用 MinGW 编译成可执行文件。...只相当于一个下载器,运行时,将会从 MinGW 官方服务器上下载真正 MinGW 安装管理器。...因为我们编译没有指定生成程序名,所以 MinGW 默认将程序命名为 a ,加上后缀名就是 a.exe 了。如果我们想在编译就指定生成程序名,就需要使用 gcc 命令 -o 选项了。...注意:选项 -o 是英文字母,并不是数字零,并且后面只能是想设置文件名。 这种在编译命名方法好像很鸡肋,初看好像只是帮我们省了一些时间,毕竟我们也可以在编译后手动改名。...以后我们程序变复杂了,可能会在一个工作目录下编译出复数个程序,这时就必须用 -o 选项了,否则编译出程序都叫 a.exe ,会在生成互相覆盖掉。

10.1K32

c和fortran混编

加上-v选项就可以看出来,gcc在编译和链接 到底做了哪些事。 又多说一点,如果一个函数有定义或者被调用,那么编译后在目标文件中就会有其相应符号,因为要告诉链接器有这个供给,或者有这个需求嘛。...如果一个函数仅仅有什么声明,那么是不会编译出符号,因为既不会给别人用,也不会用别人。...前面说了gcc是compiler collection,它会根据文件后缀来判断是什么语言写成,从而调用相应编译器来编译。.f文件自然会用g77或者f77之类来编译。...就像c++要用c库,也需要在声明这个库中函数使用extern “C”,使c++编译器在编译这个函数生成符号名是C风格而不是C++风格。...这也就是为什么时常有人问gcc main.cc会出错问题了,如果main.cc用到了c++库中函数,那么当然要使用gcc -lstdc++ main.cc才行了) 如果我们保持main.c不变,

1.5K41
领券