当前位置: 首页 > wzjs >正文

简易的网站建设搜索引擎有哪些好用

简易的网站建设,搜索引擎有哪些好用,建设网站的策划书,wp做音乐网站必备💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 C\C | 每日一练 (1)题目参考答案 C\C | 每日一练 (1) …

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • C\C++ | 每日一练 (1)
    • 题目
    • 参考答案

C\C++ | 每日一练 (1)

题目

C 是否支持函数重载? C++ 是否支持函数重载?如果支持请简述函数重载的实现原理。

参考答案

C 不支持函数重载

C 语言中,函数的名称必须是唯一的。如果尝试定义两个同名的函数,即使参数列表不同,编译器也会报错。这是因为 C 语言的函数调用机制是基于函数名称的,编译器在编译时会根据函数名称生成对应的符号,而无法区分同名函数的不同版本。

例如,以下代码在 C 语言中是不合法的:

int add(int a, int b) {return a + b;
}float add(float a, float b) {return a + b;
}

编译器编译时会报错,信息如下所示:

test.c:3:7: error: conflicting types for ‘add’; have ‘float(float,  float)3 | float add(float a, float b) {}|       ^~~
test.c:2:5: note: previous definition of ‘add’ with type ‘int(int,  int)2 | int add(int a, int b) {}|     ^~~

C++ 支持函数重载

C++ 语言支持函数定义多个同名函数,只要它们的参数类型或参数个数不同即可。C++ 编译器根据函数的名称、参数列表生成对应的函数符号(函数签名),从而可以区分同名函数的不同版本。

例如:

int add(int a, int b) {return a + b;
}float add(float a, float b) {return a + b;
}int add(int a, int b, int c) {return a + b + c;
}

底层机制

C/C++ 语言中,编译器会为每个函数生成一个唯一的符号名,并将其存储在符号表中。符号表是编译过程中用于记录程序中各种标识符(如变量、函数等)的名称、类型、作用域等信息的数据结构。

符号表的主要作用包括:

  • 标识符解析:帮助编译器在编译过程中解析标识符的含义,例如确定一个函数的返回类型和参数类型。

  • 链接:在链接阶段,链接器会根据符号表中的信息将不同模块中定义的函数和变量进行连接。

  • 调试信息:符号表还用于生成调试信息,帮助调试器在运行时找到函数的入口点、参数等。

C/C++ 语言中,函数调用的过程如下:

  • 编译阶段:首先编译器会解析源代码,根据函数声明生成唯一的函数符号,并叫符号存储到符号表中。对于后续的每个函数的调用,编译器会根据符号表中的信息生成对应的调用指令。另外如果某个函数在其他模块的中定义,编译器就会在符号表中记录一个未解析的引用,等待链接器在链接阶段处理。

  • 链接阶段:链接器会读取各个模块的符号表,将未解析的引用与实际的函数定义进行地址重定向,最终链接器会生成生成可执行文件。

  • 运行阶段:当程序运行时,操作系统会进行按需加载可执行文件到内存中,当触发到函数调用时,程序会根据链接器重定向后的函数地址跳转到对应的函数代码。

从以上的描述中可以看出,C/C++是否支持函数的重载就是看函数符号的生成机制,那么接下来给出同一个函数,分别对 CC++ 进行代码编译,查看各自函数符号生成的结果。

分别创建 test.ctest.cpp 代码文件,文件中添加函数如下所示:

int add(int a, int b) {return a + b;
}

分别编译 test.ctest.cpp 文件,生成目标文件 test.otestcpp.o,其中包含了关于add函数的代码和符号表条目。

执行编译命令,如下所示:

# 编译 test.c
gcc -c test.c -o test.o# 编译 test.cpp
g++ -c test.cpp -o testcpp.o

使用 nm 命令或者使用 objdump 命令查看两个 .o 文件,如下所示:

  • test.o 文件
$ nm test.o 
0000000000000000 T add

其中,0000000000000000 表示 add 函数的地址;T 表示这是一个代码段中的符号,通常是函数;add 表示的函数生成的函数符号。

  • testcpp.o 文件
$ nm testcpp.o 
0000000000000000 T _Z3addii

其中,0000000000000000 表示 add 函数的地址;T 表示这是一个代码段中的符号,通常是函数;_Z3addii 表示的函数生成的函数符号。

从以上的输出结果可知,对于 C++ 来说,编译器(如 GCC)对函数名进行修饰包含以下几部分:

  • _ZGCC 编译器对 C++ 函数名修饰的前缀。
  • 3:表示函数名的长度(这里是add,长度为3)。
  • add:函数的原始名称。
  • ii:表示函数的参数类型。i代表int,因此ii表示两个int类型的参数。

C++ 编译器为每个函数生成唯一的符号名,以便支持函数重载。

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

http://www.dtcms.com/wzjs/233779.html

相关文章:

  • 新疆政府建设招标网站乐陵seo外包
  • 那个外贸网站做的好怎样推广app
  • 房地产网站源码日本和韩国是亚洲的国家
  • 现在视频做网站晚了吗枸橼酸西地那非片的功效与作用
  • 中铁建设中南公司官方网站优化搜索引擎
  • 微商城手机网站制作长沙网络推广网站制作
  • 做电影网站用什么软件北京网站优化服务
  • icoc.cc是哪个网站域名互联网论坛
  • 域名注册网站制作自制网站教程
  • 美国成年做爰网站百度搜索一下就知道
  • 外国做家具的网站软文发稿平台
  • 服装厂做1688网站效果好不好网站权重查询
  • 深圳营销型网站建设价格域名备案查询系统
  • 如何注册一个网站域名万能导航网
  • 用excel做网站日志分析灰色行业关键词优化
  • ie浏览器哪个做网站稳定宁波网站推广优化哪家正规
  • 网站备案去哪备案今天头条新闻
  • 网站开发公司的色目人
  • eclipse做购物网站国内十大软件测试培训机构
  • 网站更换ico文件位置关键词排名点击软件怎样
  • 做单位网站的公司平台推广方式方法是什么
  • 广西壮族自治区招生考试院seo百度排名优化
  • 如何将html发布到网站西安快速排名优化
  • 专题研究网站建设工作动态平台推广销售话术
  • 网站制作的收费营销网站建设软件下载
  • 保定网站搜索引擎优化深圳全网推广
  • 一般做网站带宽选择多大的百度浏览器官网下载
  • 泉州网站建设+推广苏州网络推广服务
  • 卡盟网站怎么做独立站建站平台有哪些
  • 建一个国外的网站百度95099怎么转人工