C\C++中的链接类问题整理

C\C++面试重点大集合(一) 春招的时候,我自己整理了一份C++的面试重点,面试了七八家,发现基本没有超出这个范围的,可以说,背下本文的重点,对于想找一份C++开发工作的小伙伴来说,已经成功了一半。 本文除了帮助作者找到了大厂工作,还帮助我周围很多小伙伴拿下了心仪的offer,可以说目标不是大厂的小伙伴,只要把这些掌握了,拿一个二三线城市10k+,一线城市15k+的工作是没问题的。 本文篇幅较长,内容较长但都是精华,建议有需要的小伙伴收藏熟记! 本文针对于需求C++开发工作的小伙伴,整理了C++相关重点,本系列将持续更新,喜欢的小伙伴希 阅读详情

在C\C++的代码的初学阶段,常常会出现"XXX重定义"、”,或“XXX未定义”等问题,尤其是在初次接触比较复杂的代码的时候,各种文件关系复杂,在编译时猛然蹦出这么一个问题,乍一看让人有点摸不着头脑。为了详细介绍这个问题,下面将引用一个简单的来展示这种bug的出现,并给出相应的解决办法。

以C++为例,假设有两个功能A.cpp\B.cpp,以下为A.cpp对于的.h文件(只做演示)

class A
{

};

B.h文件如下

#include "A.h"

class B{

};

首先,建一个main.cpp,具体如下

#include "A.h"
#include "B.h"

int main()
{
    return 0;
}

此处只用作演示上文提及的错误生成过程,所以啥也没写。

而当我们编译的时候,神奇的事情出现了,编译器弹出来这么一个错误:

由于VS现在已经有中文翻译了,所以出现那个令人绝望的“redefined XXX ...”已经不再出现,但是这个问题本身依然让人觉得有点摸不着头脑。实际上,这是由于C\C++编译器在编译的预处理阶段是将include " .h"中的内容直接插入对应的.cpp文件中,所以,既包含了"A.h",又包含了“B.h”的main.cpp中就会出现两个A类,重定义即由此而来。

具体解决方法:

本文采用的是用h文件中的宏来解决这一问题,具体为在A.h中加入

#ifndef _A_H_
#define _A_H_
void f();

class A
{

};
#endif // !_A_H_

使得A类值插入一次,因此解决了重定义的问题。

同样,若在.h文件中定义变量global,如

#ifndef _A_H_
#define _A_H_

int global;

void f();

class A
{

};
#endif // !_A_H_

同时在a.cpp中写一个函数

#include "a.h"

void fun() {
	global++;
}

在进行编译时出现了这样一个错误

又感觉很头大啊,错误在哪里呢?

咱们来详细看一下编译发生的过程:

在上面我们不难发现,每个cpp文件都是单独编译的,其只有到最后链接的时候才会在一起出现,结合上面的知识我们就知道了,每个包含include " a.h"的cpp都会生成一个int global变量,但在编译是各不影响,直到链接时才会出现“重定义”这一问题,这就是为什么我们不能在.h文件中定义变量,而要将全局变量通过extern关键字甩出来的原因了。

写在最后:这篇文章是从翁恺老师的C++课中总结出来的,尽管是一些在初学阶段出现的问题,但其中展现出来的C\C++编译器的相关知识却非常深刻,听完之后收益良多

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一) 《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选 阅读详情

相关推荐

《拉依达的嵌入式\驱动面试宝典》—前言&目录篇

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 1931

C++ 使用静态类实现跨类调用

最近看代码,发现一个很好用但是我一直不知道的东西. 就是在C++中一个类调用另外一个类的函数.A类像调用B类的函数,并且要打印B类中的数据. 当然方法有很多. 第一种方法:比如在A类中实例化B类,但是需要另外类的数据,实例化就不行,因为重新搞了一个对象.数据什么都没有了. 第二种方法:在A类中接收B类的指针实现,优点是好理解,缺点是,你得能找到B类的指针,并且接收到B类指针. 第三种方法:A类继承B类,当然,要是两个类没什么关系,继承显得如此不协调. 第四种:就是我最近看到的使用静态方法,A类调

m0_38036750的博客 3328

STRING数据库的蛋白质相互作用(PPI)网络分析

在转录调控相关的文献中,我们经常能够看到这样的蛋白质相互作用网络(protein protein interaction network,PPI network)。具体而言,这些相关的文献中首先通过RNA-seq、表达谱芯片或者蛋白质组分析等,找到了在不同分组样本间一系列的差异表达基因或蛋白。

weixin_43029125的博客 9453

C++学习Day03——链接(Linker)

Day03 链接(Linker) 什么是链接及主要工作 链接就是从c++源码到可执行二进制的一个过程。所以第一阶段是编译我们的源文件;一旦我们编译了文件,我们需要通过一个叫做链接的过程。现在链接的主要工作就是找到每个符号和函数的位置,并将他们链接在一起。每个文件被编译成一个独立的obj作为编译单元(translation unit)。 链接的主要工作就是将文件链接到一个程序。 如何区分编译及链接 vs有一种方法可以区分编译和链接。如果按下ctrl+f7 或者只按下 编译 按钮,只有编译会发生,链接完全不会发

weixin_44176958的博客 1565

ubuntu20.04开机黑屏卡在/dev/sda1:clean,***files,***blocks,解决心得记录

这个问题如果你百度,会发现目前有很多种解决方法。 有更新显卡驱动的,有卸载上一次安装软件的,还有各种奇奇怪怪的故障原因。 如果你是属于上述情况,那么按照百度和论坛的各种指引操作一般都能解决。 但我这里主要说一种特殊情况,就是我什么也没有操作,我什么也没干。就是正常使用系统关了机突然就报错了。 这也是自己亲自遇到的问题,做个小记录方便以后自己回顾。 上一次出现这种情况我重装系统了,这次用了两个月又出现了,重装成本太高,我接受不了,于是找到解决办法。 首先找个终端进入,进入终端的方法很多,用安装u盘

qq_41517017的博客 2万+

AI办公Agent技术:文档与表格智能处理实践

办公自动化技术正从规则驱动转向语义理解,大语言模型(LLM)为办公Agent赋予了智能决策能力。这类系统通过五层架构整合自然语言处理、工具API调用和任务规划引擎,能自动完成文档分类、表格分析等高重复性工作。关键技术包括基于TF-IDF和BERT的特征提取、Excel公式自动生成等,在财务报告、法律审查等场景可实现90%以上的效率提升。随着多模态能力和领域专业化发展,办公Agent正在重塑企业文档处理流程,成为数字化转型的核心基础设施。

weixin_30263277的博客 519

C/C++中链接属性

标识符的链接属性决定处理在不同文件中出现的标识符,一共分三种-none(无)、external(外部)和 internal(内部)。 1、none:函数形式参数和代码块内声明的变量在缺省情况下具有none链接属性 。 2、external:并非声明于代码块内的变量,缺省情况下具有external链接属性,(函数名也不包含于任何代码块)。 3、缺省情况下,除了上述说明的external属性以外,其余...

bob的博客 804

历年北京理工大学复试专业综合题

。

A place to record sth. 2万+

C++中关于类的链接问题的一些个人愚见

最近在思考在不同的源文件中的同一份类的定义(重新写一遍或包含头文件导致)在链接时不会出现重复定义的链接错误,查到资料说类的定义是内部链接属性,意思就是说不同源文件中的类定义相对源文件是局部性质,各个源文件中互相不可见。所以在此基础上我理解的是,类的定义中只有成员变量和成员函数的声明,类的成员变量和成员函数的定义都在定义类的文件名的源文件中,所以在各个源文件中都包含了类的定义,但是并没有包含类的成员

binjiajia的博客 395

WSL2+Ubuntu-22.04搭建PX4仿真环境:从零避坑到一键起飞

本文详细指导在Windows系统上通过WSL2和Ubuntu-22.04搭建PX4仿真开发环境的完整流程,涵盖环境配置、源码下载、依赖安装、Gazebo仿真及常见错误解决方案,帮助开发者从零避坑实现无人机一键起飞仿真。

k8s6orchestrator的博客 670

【LE Audio】CAP精讲[1]: 从理论到实操,CAP 协同流程入门全攻略

LEAudio生态中的CommonAudioProfile(CAP)是一个关键协同框架,它通过整合基础音频协议(BAP/VCP/MICP等)构建多设备协同能力。CAP定义了三大核心功能:音频流管理、设备组控制和统一交互服务,解决了传统蓝牙音频在多设备场景下的协同痛点。其规范历经v1.0到v1.0.1的优化,修正了角色定义、连接流程等关键模块,提升设备兼容性。CAP采用严格的语言约定(shall/must/should)和术语体系(ContextType/CCID/协同集),确保不同厂商设备能相互理解。

byte轻骑兵的技术小窝 2万+

C++学习:链接

从源程序到可执行代码要经过编译和链接两个过程,如果通过编译按钮或者ctrl+F7,那么只执行编译,而不进行链接,所以仅仅生成了.obj文件。如果使用build(生成),那么同时完成编译和链接。编译之后,需要将各个.obj文件链接起来,因为这个单独的文件本身在编译的时候相互之间并没有关联。 因此需要有链接器来帮助它们形成最终的可执行文件。即使所有的代码都写在一个文件中,也需要链接器来帮助确定程序入口的位置,.exe文件需要指定一个入口函数,一般情况下,这个入口函数都是main,但是也可以是其他的函数。 #in

w1647114628的博客 2952

为什么idea已经改了UTF-8还是乱码,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1576

C与C++相互调用注意事项

1. C如何调用CPP代码 在C中如何调用C++函数的问题,简单回答是将函数用extern "C"声明; 然后C代码中不要include C++的头文件, 而采用直接在C中增加函数声明的方式; /*C++ code*/ extern "C" void f(int); void f(int i) { // your code } /*C code*/ void f(int); // 不引入, 而只是直接声明 void cc(int i) { f(i); //调用 // other code } 如果

尘缘里的记忆的博客 1940

无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程

当您遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息时,请按照上述步骤来解决问题。当您尝试加载文件C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1时,可能会遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息。请注意,更改执行策略可能会带来一些安全风险。

PixelInk的博客 1921

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C C++混合编程整理

C C++混合编程翻译整理。

红红火火恍恍惚惚 530

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

超全面的后端开发C/C++面经整理分享含详细参考答案 包括简历分享

本文为博主2020年秋招提前批的c/c++后端开发面经整理,包括C/C++语言基础,计网,数据库,linux,操作系统,场景题,智力题和hr常问题。面试问题来自前人的工作和博主面试时遇到的值得记录的问题,其中面试题答案多为博主自行解答(并且面试的时候也基本是这样回答的),回答中都附上了参考资料的链接,全文共七万余字,仅供大家作为面试准备材料的参考。 希望大家在准备面试的时候都能建立一个属于自己的题库,自己从网上寻找问题,然后自己进行解答,并且记录下来,这样在面试的时候就能行云流水般的回答上来。因此我把这份面

GhostLWB的博客 10万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ - C与C++相互调用 extern “C“_c和c++互相调用

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

2401_84003733的博客 870

C/C++开发环境

如同, 缺少了对cJSON的编译,这里对成员函数的所需的c/cpp文件未被编译。也就是按单文件编译方法对多文件进行编译。解决办法:在tasks.jason 中设置源文件,将"args"的值语言CC++C/C++这里的 ${fileDirname} 表示当前目录。

Watom_663的博客 3289

【C++】面试题目,整理自牛客网

来源 1、写出完整版的strcpy函数 char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘...

四轩茶屋 2万+

c++中string类的详解

通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了! 下面先罗列出string类的函数有哪一些,然后再罗列出函数的原型,最后到代码的实现 标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用。现将具体用法的一部分罗列如下,只起一个抛砖

yzl_rex 11万+

为什么不能把#include 指令放置在 extern "C" { ... } 里面?

关注、星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥在你工作过的系统里,不知能否看到类似下面的代码。这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们的代码都是这样写的,从来没...

李肖遥的专栏 784

Parasoft C/C++test 常见问题整理大全(三)

Parasoft C/C++test帮助团队写出更好的代码,实施更有效的测试,以及持续地监视以实现质量目标。 C / C ++test可以进行静态分析,全面代码审查,运行时错误检测,并在单元测试和组件测试中集成覆盖率分析。这些能够在开发周期的开始阶段,在开发桌面上自动完成。 一、C/C++测试无法启动。 在启动CppTest时,经常会挂起并且无法启动。在加载一些svn或mylyn相关插件时加载过...

ymy_666666的博客 6543

C/C++字符串使用整理

一、C字符串处理函数:1、字符串长度strlen(st); //字符串长度,返回一个int型值2、字符串初始化char st[5];memset(st,'c',sizeof(a)); //将字符数组a初始化为’c’3、字符串比较char str1[5],str2[5]strcmp(str1,str2); //str1>str2返回值大于0,<返回小于0,等于返回等于0strncmp(...

weixin_30836759的博客 261

Matlab函数封装为DLL供Cpp调用

Matlab函数封装为DLL供Cpp调用 文章目录Matlab函数封装为DLL供Cpp调用Ⅰ目标Ⅱ 学习Ⅲ 实现1. Matlab 函数封装为DLL2. vs2015中C++调用Matlab DLL步骤Ⅳ 问题解决Ⅴ 后续可能有用信息 Ⅰ目标 Matlab函数封装为DLL,供Cpp调用 Matlab函数为类函数,matlab函数功能复杂 Ⅱ 学习 整体流程: ①**(整体学习)**浅析将matlab函数编译成dll供Cpp调用的方法 http://blog.sina.com.cn/s/blog_9

xiao2yang1998的博客 2957

C#调用C/C++动态链接库笔记(一)

因为作者是小白,所以这篇文章讲的不会很深入,就以这前天调用库函数遇到的问题跟大家分享一下,有好多地方也是不求甚解,但最终调用是成功了。主要就以C#中dll调用,C的数据类型移植,C的指针在C#中如何实现,还有很难受的指针函数(这个作者搞了好久),还有一个是结构体在C#中的实现,最后是结构体中联合体在C#中如何调用(这个也很难受)。 C#调用dll [DllImport("fun_ptr.dll",...

qq_35496059的博客 1438
上一篇: Leetcode笔记整理—easy篇—66.Plus one
下一篇: 关于RK3399 安装 numpy Illagal instruction
晴川QZ
博客等级 码龄10年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值