【C++】复习1(函数符号生成规则、内联函数、C/C++相互调用、const 、引用)

C和C++的区别和联系(扩展知识) 2017/3/17 复习整理:C/C++区别与联系; 关于C和C++的区别是面试中经常会被问到的问题,本着即将面试的心态,进行知识整理,并对小知识点进行扩展; C/C++的联系: C++是C的超集,兼容大部分C的语法的结构; 联系嘛我只能想到这个,毕竟cplusplus嘛! C/C++区别: 第一点就应该想到C是面向过程的语言,而C++是面向对象的语言,一般简历上第一条都 阅读详情

目录

一、函数的默认值

二、函数符号生成规则

三、函数重载

 四、内联函数

五、C/C++的相互调用

六、引用

七、const


一、函数的默认值

    1、自右向左依次赋值(原因:与匹配 顺序有关,参数匹配是从左向右);

    2、不能重复赋值;

    3、一般给在声明上。

二、函数符号生成规则

    1、C函数符号生成规则:

                   与函数名有关  

                _cdel调用约定(C标准调用约定):函数名前加下划线。(调用方开辟,调用方清理)

                _stdcall调用约定:函数名前加下划线,函数名后加“@”符号和其参数字节。(调用方开辟,被调用方清理)

                _fastcall调用约定:函数名前加“@”符号,函数名后加“@”字符和其参数字节。

    2、C++函数符号生成规则:

                  函数原型有关:

                      1)函数返回值(不能作为重载的依据);

                      2)函数名称(不能作为重载的依据);

                      3)函数形参(类型、个数、顺序)。

                 _cdecl调用约定:“?”+函数名+参数表的开始标识 “@@YA” + 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

                 _stdcall调用约定:“?”+函数名+参数表的开始标识“@@YG”+函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

                 _fastcal调用约定:“?”+函数名+参数表的开始标识 “@@YI”+ 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
 

int Max(int a, int b)//?Max@@YAHHH@Z
{
	return a > b ? a : b;
}
double Max(double a, double b)//?Max@@YANNN@Z
{
	return a > b ? a : b;
}
char Max(char a, char b)
{
	return a > b ? a : b;
}
int main()
{
 
	int max = Max(10, 20);
	char max = Max('a', 'b');
    double max = Max(0.23,0.21);
	return 0;
}

三、函数重载

          同名函数的关系

函数重载的三要素:

           1)同名;

           2)形参不同(①形参类型不同、②形参个数不同、③形参顺序不同)

           3)同作用域

  注意:同函数名、同参数列表、返回值不同的函数重载 和 有默认实参函数的重载 不能构成函数重载。编译器只使用形参列表来区分重载的函数,所以同函数名,同参数列表,返回值不同的函数重载 和 有默认实参函数的重载,编译无法区分,然后报错。

 四、内联函数

将规模小,而使用频繁的函数声明为内联函数。

1、定义:

inline函数:在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。

    指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大。内联函数并不是必须的,它只是为了提高速度而进行的一种修饰。要修饰一个函数为内联型,使用如下格式: 
inline 函数的声明或定义 
简单一句话,在函数声明或定义前加一个 inline 修饰符。 
inline int max(int a, int b) 
{ 
   return (a>b)? a : b; 
}

简而言之就是:把代码在函数的调用点直接展开(以空间换时间)

2、注意事项:

        1)写在头文件下;在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。

        2)只在release版本生效;

        3)是给编译器的一个建议(由编译器决定);

        4)加在声明点一定无效(inline是基于实现的,不是基于声明的)内联函数要在函数被调用之前声明。关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

        5)一定不能设置成inline 的有(递归、循环、switch),否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。 

3、inline函数和宏的区别    (内联是一种更安全的宏)

        inline函数是在编译阶段展开;有类型检查和安全检查

        宏是在预编译阶段展开代码,不需要额外的空间和时间方面的开销。无类型检查和安全检查。

宏的不足:
     1)宏不能访问对象的私有成员。
     2)宏的定义很容易产生二意性。

内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。可以向调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

当执行开销  小于  调用开销(开栈开销)     建议用inline

执行开销   大于   调用开销                不建议用inline

五、C/C++的相互调用

       C 编译器编译函数时不带参数的类型信息,只包含函数的符号名字。如 void foo( int x ) , C 编译器会将此函数编译成类似 _foo 的符号,C 链接器只要找到了调用函数的符号,就会认为链接成功。而 C++ 编译器为了实现函数重载,会在编译时带上函数的参数信息。如它可以把上面的函数编译成类似于 _foo_int 这样的符号。

在C/C++相互调用时用   extern"C "声明  把包含的代码以C的规则进行处理。

1、C++调用C

    在.cpp文件加上extern"C"

/* cfile.c */

#include <stdio.h>

void C_Func()
{
    puts("Hello, I'm C_Func");  
}

 

/* cppfile.cpp */

#include <iostream>

extern "C" void C_Func(void);

int main()
{
    C_Func();
    return 0;
}

2、C调用C++

    1)C++源文件可以修改   在.cpp加extern“C”(整个函数)

    2)C++源文件不可修改  加中间层

/* cppfile.cpp */

#include <iostream>
#include "cpphfile.h"

using namespace std;

void Myclass::print()
{
    cout << "Hello, I'm print function." << endl;
}
/* cpphfile.h */

#ifndef _CPPCLASS_H__
#define _CPPCLASS_H__

class Myclass{
public:
    void print();
};

#endif
/* wrapper.cpp 这个文件实现调用 C++ 的接口*/

#include "cpphfile.h"

extern "C" {

    struct wrapper_class{
        Myclass w_class;
    };

    struct wrapper_class* get_object()
    {
        return new struct wrapper_class;
    }

    void call_cpp_print(struct wrapper_class* p)
    {
        p->w_class.print();
    }

}
/* cfile.c */

#include <stdio.h>

struct wrapper_class *test;

int main()
{
    /* 创建对象 */
    test = get_object();

    /* 调用 C++ 函数 */
    call_cpp_print(test);
    
    system("pause");
}

 

    .c被调用  用 #ifdef_cplasplas

 

六、引用

符号:&  别名

#include<iostream>
using namespace std;
int main(){
    double a=10.3;
    int &b=a; //错误,引用的类型必须和其所绑定的变量的类型相同
    cout<<b<<endl;
}

引用的特点:

    1)引用一定要初始化(要先有内存单元再起别名)

              底层使用指针支持,在所有引用变量使用的地方,系统自带解引用。

    2)引用不能引用不能取地址的数据(只能引用能取地址的数据)

    3)引用不能改变(别名一旦赋予,便不能改变)

    4)引用变量使用时使用的是引用变量(别名)所引用的 变量

    5)引用不是定义一个新的变量或对象,因此内存不会为引用开辟新的空间存储这个引用

#include<iostream>
using namespace std;
int main(){
    int value=10;
    int &new_value=value;
    cout<<"value在内存中的地址为:"<<&value<<endl;
    cout<<"new_value在内存中的地址为:"<<&new_value<<endl;
    return 0;
}

//value  地址:0x6ffe44
//new_value  地址: 0x6ffe44

 常引用  引用  不能取地址的数据   数据生成一个临时量,取临时量的地址,常引用引用临时量。

引用作为函数的返回值

引用作为函数的返回值时,必须在定义函数时在函数名前加&

七、const

C++  const修饰的属性为local属性

在C语言中:const修饰的是常变量  在编译阶段   常变量是否被做左值,其他处理与变量一样。

在C++中 :是常量    在编译阶段      把用到常量的地方替换成常量初始化的值。

语法:const 类型 &引用名=目标变量名;

常引用不允许通过该引用对其所绑定的变量或对象进行修改

#include<iostream>
using namespace std;
int main(){
    int a=10;
    const int &new_a=a;
    new_a=11;//错误!不允许通过常引用对其所绑定的变量或对象进行修改 
    return 0;
}
#include<iostream>
#include<string> 
using namespace std;
string func1(){
    string temp="This is func1";
    return temp;
}
void func2(string &str)//改为 void func2(const string &str)
{
    cout<<str<<endl;
}
int main(){
    func2(func1());
    func2("Tomwenxing");
    return 0;
}
//程序报错:这是由于func1()和“Tomwenxing”都会在系统中产生一个临时对象(string对象)来存储它们,而在C++中所有的临时对象都是const类型的,而上面的程序试图将const对象赋值给非const对象,这必然会使程序报错。如果在函数func2的参数前添加const,则程序便可正常运行了

 

 

C_C++函数符号生成规则(函数名的修饰);C++ 函数重载.pdf 立即下载

相关推荐

告别VLC!用Python+OpenCV实时拉取RTSP监控流,并实现抽帧降低延迟(附完整代码)

本文介绍了一种基于Python和OpenCV的低延迟RTSP监控流处理方案,通过抽帧技术显著降低延迟并保持视频分析准确性。文章详细讲解了RTSP流处理的基础挑战、抽帧技术原理与实现,以及完整的低延迟处理方案,包括硬件加速配置和动态抽帧算法,帮助开发者优化监控视频流处理性能。

weixin_30333885的博客 272

C/C++函数符号生成规则(函数名的修饰);C++ 函数重载

函数符号(函数的名字修饰):在编译阶段生成的字符串,来指明函数的定义或原型 。 C函数符号生成规则: _cdel调用约定(C标准调用约定):函数名前加下划线。 _stdcall调用约定:函数名前加下划线,函数名后加“@”符号和其参数字节。 _fastcall调用约定:函数名前加“@”符号,函数名后加“@”字符和其参数字节。 C++函数符号生成规则: _cdecl调用约...

Scl_Diligent的博客 4945

ubuntu20.04安装nvidia-docker(解决有 Release 文件。 N: 无法安全地用该源进行更新,所以默认禁用该源错误)

然后想都不要想,nvidia+linux安装的东西,那肯定是不能安装成功的,恶毒的nvidia。按照nvidia官网给出的安装nvidia-docker流程来。在sudo apt-get update出现报错。然后再次update,发现还是会有一些警告类似于。,直接点击网页手动下载,发现下载成功!,注意会有安装先后顺序,安装给的提示就行。最后输入命令发现安装成功。然后替换掉里面的内容。直接不管,直接上命令。

weixin_48144140的博客 1235

函数重载、C/C++符号生成规则

加粗样式

m0_37857539的博客 831

自学篇--使用keil5.23创建一个stm32工程并编译(固件包自带版本)

之前在本科学习阶段学习过一点51单片机的知识,可是因为基本没有实践过几次现在已经完全忘记了。。前几天老师突然丢给我几个板子说让我把程序编译、烧写环境装好,当时我就震惊了,不过经过三四天的自我摸索,之后参考他人的学习经验,现在已经基本能处理这个问题了,所以为了方便后面的学者,主要也是为了把自己这几天的学习成果记录一下,我在这里把这个过程写下来。(因为刚刚接触,很多原理性的东西都还不懂,只是一个操作步

yang_csdnForOBTS的博客 8658

RK3568—基于GM8775C的MIPI转双通道LVDS屏幕调试

Rockchip RK3568 原生显示接口不支持双通道LVDS屏幕的数据输出,因此需要借助显示转换芯片才能实现双通道LVDS屏幕的驱动。本文介绍使用GM8775C芯片方案,在 RK3568 平台实现单路 MIPI DSI 信号输出来驱动双通道LVDS显示屏。 关于GM8775C GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能,MIPI 支持 1/2/3/4 通道可选,每通道最高支持 1Gbps 速率,最大支持 4Gbps 速率。LV.

Industio_优快云的博客 1万+

【C++ 函数 基本教程 第六篇 】深度解析C++函数符号:GCC与VS的名称修饰揭秘

在我们的编程生涯中,我们都会遇到一些看似神秘的符号,这些符号在我们的代码中出现,但是我们可能并不完全理解它们的含义。这些符号,或者更准确地说,这些函数符号(Function Symbols),在C++编程中扮演着重要的角色。本文将深入探讨这个主题,揭示这些符号的秘密,以及它们如何影响我们的编程实践。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 985

YOLOv11 Neck革新:当SDI遇上BiFPN,带你打造精度飙升的特征融合网络

对于科研:这是一个新颖的特征融合思路,能做出差异化的实验,发论文、做项目都很有价值;对于工程:它能解决小目标漏检、大目标定位不准的痛点,让你的检测系统在工业质检、智能安防等场景下更可靠;对于技术成长:掌握了SDI和BiFPN的设计逻辑,你再去看其他特征融合方法(比如FPN、PAN),会有“一通百通”的感觉,以后优化任何检测模型都能举一反三。如果你之前在目标检测的精度上遇到了瓶颈,不妨试试SDI+BiFPN——它就像给YOLOv11装上了“透视眼”,让模型能看清每一个细节。

FJN110的博客 301

C与C++中的常用符号与标点用法详解及实例

本文以实例,详细讲解了C及C++语言中的常用符号及标点所表达的意义、用法及注意事项。

billliu66的博客 3万+

23、OpenMP常见用例与标准循环级示例详解

本文详细介绍了OpenMP的三种典型用例:循环级OpenMP、高级OpenMP和MPI+OpenMP,适用于不同层次的并行需求。重点讲解了循环级OpenMP在向量加法、流三元组和模板计算中的应用示例,并探讨了首次触摸优化、线程绑定、NUMA架构影响等关键性能优化策略。通过实际代码演示和性能分析,帮助开发者快速掌握OpenMP的基础并行化方法,并为后续高性能优化提供指导。

fanta的博客 84

交通仿真软件:SUMO_(1).SUMO基础知识

SUMO 中的交通网络由节点(junctions)和边(edges)组成。节点表示交叉口或路网的连接点,边表示连接节点之间的道路。节点:节点文件(.nod.xml)定义了网络中的所有节点。每个节点有一个唯一的 ID 和坐标。</边:边文件(.edg.xml)定义了连接节点的边。每个边有一个唯一的 ID、起点节点 ID 和终点节点 ID。</车辆文件(.vtype.xml)定义了不同类型的车辆。每个车辆类型可以有不同的参数,例如长度、最大速度、加速度等。</

kkchenjj的博客 1430

【C++ 入门精讲1】初始化、const、引用、内联函数 | 超详细手写笔记(附完整代码)

C++、C++ 基础、const、引用、内联函数、函数调用过程、内联函数与宏区别

2501_90355051的博客 457

组建高效AI开发团队:角色、技能与协作

在当今科技飞速发展的时代,人工智能(AI)已经成为各个领域的核心驱动力。组建高效的AI开发团队对于企业和科研机构来说至关重要,它能够推动创新、提高竞争力、实现业务目标。本文的目的在于为那些希望组建或优化AI开发团队的管理者、技术负责人以及相关从业者提供全面的指导。范围涵盖了团队角色的定义、所需技能的分析、团队协作的策略,以及实际项目中的应用和相关资源的推荐。本文将首先介绍AI开发团队的核心概念与联系,包括团队角色、技能和协作之间的关系。接着阐述核心算法原理和具体操作步骤,结合数学模型和公式进行详细讲解。

2502_91592937的博客 995

1.CPP的入门

cpp学习复习

Autuxy的博客 1149

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++总复习--2--C++程序设计--C/C++区别

C++总复习--2--C++程序设计--C/C++区别

数组越界,数组进栈 175

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++复习笔记2

C++复习笔记2函数重载(重定义)三要素函数符号的生成规则1.C以函数名为生成规则2.C++以函数原型为为生存规则new和malloc引用内联函数inline函数的默认值C和C++的相互调用 函数重载(重定义) 是函数符号生成规则中的函数形参作为支持 三要素 1.同名 2.不同参数 3.同一作用域 函数符号的生成规则 1.C 以函数名为生成规则 2.C++ 以函数原型为为生存规则 返回值 函数名...

一个代码小白的进阶之路 185

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

史上最全的C++/游戏开发面试问题总结(一)——C++基础

笔者毕业两年,最近通过猎头拿到了腾讯IEG以及网易游戏的两个客户端研发offer(UE4/C++)。在面试前夕,笔者对C++进行了较为全面的复习和总结,乐观估计可以涵盖80%左右的面试基础问题。 这个系列的文章预计有《C++基础》、《内存、STL、虚函数相关》、《数据结构与算法》、《操作系统与网络》四篇(后续可能会调整),每篇都是以问答的形式分享并给出了参考资料的链接地址。大部分问题回答的比较简洁...

Jerish的博客 2万+

C和C++重难点复习笔记(一)【面向过程】

最近抓住一些空闲时间,做一做C++的面试题目。买了一本人民邮电出版社的《C和C++程序员面试秘笈》,作者是董山海。 现在学完了前三章的内容,分别是【C/C++程序基础】、【预处理、const、static和sizeof】、【引用和指针】三部分。 由于是零零散散学习的,学过的东西总是忘记,因此决定每隔一段时间,复习一下学过的东西,做一个总结。 总的来说,这本书在目前我学到95页为止,已经发现了...

微鉴道长的博客 1258

C++类和对象复习

C++支持函数重载的原理,const 成员函数,记录C++复习时遇到觉得比较重要或者有一定难度但是比较零散的知识点,希望和大家一起分享。

2301_76293625的博客 941

C++总复习(一)

C++总复习 1.虚拟地址空间布局 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJJe5SAM-1596418470264)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200802174124697.png)] (1)保留区的作用? ​ 保留区的目的是不可访问的区域(不允许读写),128兆大小,放入的是c的库,C语言的基本库,操作系统基本函数(操作系统调用) (2)命令行参数: int

star_fighting的博客 354

C++函数进阶:内联、引用、重载与模板实战解析

在C++编程中,函数不仅是代码复用的基本单元,更是性能优化和泛型编程的核心载体。理解函数的工作原理,特别是参数传递机制和调用约定,是编写高效代码的基础。通过内联函数,开发者可以用空间换时间,消除小型函数的调用开销;引用变量则提供了比指针更安全、更直观的别名机制,是实现高效参数传递的关键技术。这些特性共同支撑起C++在系统编程和高性能计算领域的价值。在实际应用场景中,无论是设计通用算法库、实现回调机制,还是构建灵活的API接口,都离不开函数重载和函数模板的配合使用。本文聚焦于C++函数的高级特性,深入探讨内联

weixin_30437847的博客 418

C++复习笔记(一)——const

const可用来定义一个常量。如: const int i; // 定义一个int类型的常量 int const i;//同上 const int * p; //定义一个指向常量的指针,即不能通过指针修改这个指针指向 的值(可以改变p,但不能改变*p) int * const p; //定义一个常量的值,即不能修改这个指针的指向,但可以修改其指向地址上所存储的指(可以改变*p,但不...

123DUO的学习笔记 259

【C++复习】:入门基础

NULL = 0(整数)nullptr = 真正空指针//传入NULLvoid func(int*)//预期void func(int)//结果有误。

2402_83910930的博客 383

C++复习day04

函数重载,引用,const,内联函数和宏

2301_79420799的博客 1111

C/C++基础语法复习(一):C++与C语言的区别,主要有这些!

和C的区别: 1.概念: C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。 C++的很多基础语法跟C差不多。 2. 函数默认值: C89标准的C语言不支持函数默认值,C++支持函数默认值,且需要遵循从右向左赋初始值。 3.函数重载: C语言不存...

CodingPs的博客 1335

C++复习之const限定符

C语言中的const 在C语言中const限定符是由编译器保证被修饰的变量”常量”属性,其在运行时依旧可以被改变,也就是说C语言中被const修饰的变量并不是真正意义上的常量,而是一个只读变量。   const只读变量内存的分配 和普通变量的分配规则一样,局部const只读变量的空间分配在栈上,全局const只读变量的空间分配在只读存储区(确切的说是只读静态存储区)   对C中c

早起的虫儿灬 514
上一篇: 【C++】编译、链接运行原理及内存布局
下一篇: 【C++】复习2(C/C++的区别、动态内存(new、malloc的区别))
like_that
博客等级 码龄8年 88粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值