利用预编译解决C/C++重复定义的错误 -2020.09.13

我们现在有main.c和function.h两个文件

main.c

#include <stdio.h>

#include "function.h"

int main() {
printf("Hello, World!\n");
printf("\t1+2+...+100\n"sum(100));
return 0;
} int sum(int n) {
int res = 0;
for (int i = 0; i < n; ++i) {
res += i;
}
return res;
}

function.h

//#ifndef __SUM_H
//#define __SUM_H int sum(int n);
int A = 0; //#endif

我们使用命令gcc main.c -o hello,再使用ls,可以看到当前目录下已经生成了hello.exe

然后我们再使用命令.\hello.exe运行程序,.\表示当前目录

到目前为止都没什么不对的地方,现在我们添加一个function2.h,并在main.c中引入function2.h

function2.h的内容如下

#include "function.h"

main.c引入部分修改为

#include <stdio.h>

#include "function.h"
#include "function2.h"

我们再次使用命令gcc main.c -o hello,发现出现了报错信息redefinition

意思就是重复定义了变量A,那么我们需要在function.h中加入预编译指令#ifndef #define #endif,

这样可以有效防止重复定义或者重复包含的问题,我们将function.h中的三条预编译指令解注释

function.h修改为

#ifndef __SUM_H
#define __SUM_H int sum(int n);
int A = 0; #endif

我们再次使用命令gcc main.c -o hello,发现编译正确通过了,再次运行程序

结果正确,因此在规范的开发当中我们需要使用#ifndef #define #endif来防止重复定义的问题

利用预编译解决C/C++重复定义的错误 -2020.09.13的更多相关文章

  1. 【转】利用匿名namespace解决C++中重复定义的问题

    目录 利用匿名namespace解决C++中重复定义的问题 原文:https://blog.csdn.net/pi9nc/article/details/11267031 利用匿名namespace解 ...

  2. 如何利用预编译指令来判断Delphi 的版本转载

    条件符号 含义 VERxx 编译器版本,XX表示版本,例如:Delphi 1.0 的编译器版本为80.Delphi 5.0 的编译器版本为130WIN32 是否WIN32的运行环境(Windows 9 ...

  3. C++编译报错:重复定义

    http://note.youdao.com/noteshare?id=cb2bed862a2daae89775603168f297af

  4. c++工程重复编译与重复定义

    #ifndef #define #endif防止的是"重复编译",而不是"重复定义"重复编译可能造成重复定义,但重复定义的来源不只有重复编译从代码变成可执行的程 ...

  5. keil C51中建立多文件时,变量重复定义的解决

    c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下. 对于比较小的程序,一般只有一个c文件和一个头文件,全局变量 ...

  6. 深入理解include预编译原理

    http://ticktick.blog.51cto.com/823160/596179 你了解 #include 某个 .h 文件后,编译器做了哪些操作么? 你清楚为什么在 .h文件中定义函数实现的 ...

  7. .NET MVC Razor模板预编译(二)

    在前面一片文章:<.NET MVC4 Razor视图预编译(一)> 里面我采用的是PrecompiledMvcViewEngineContrib组件进行预编译视图的虚拟地址注册,但是这个组 ...

  8. .NET MVC4 Razor视图预编译(一)

    在平时使用.NET MVC中不乏有类似的需求:某些razor视图,特别是系统后台的视图,不想让用户自行更改,需要通过某种方法把视图模板编译到项目的dll中去. 但是VS并不提供razor的预编译,如果 ...

  9. 关于JavaScript预编译和执行顺序以及函数引用类型的思考

    昨晚在对项目中的一部分做模块化处理的时候,遇到了一个问题,一个重新定义的function对一个通用类中的function进行赋值覆盖的时候,失败了.问题抽象出来是这样的: <script > ...

随机推荐

  1. Code Review 从失败中总结出来的几个经验

    资深的程序员都知道 Code Review 可以对代码质量,代码规范,团队代码能力提升带来很大的提升,还有著名的技术专家"左耳朵耗子"也说过: 我认为没有 Code Review ...

  2. Linux中.bashrc与.bash_profile的对比

    如果你平时在命令行上花费了大量时间,那么你可能会萌生出希望定制 Shell 环境的想法.今天本文就和大家讲解该如何实现你们的这个想法.其实可以通过创建别名.向环境变量 $PATH 添加新目录或更改 S ...

  3. Ubuntu 16.04 sudo免密码visudo sudoers设置

    使用sudo visudo调用nano对 /etc/sudoers 进行修改 $ sudo visudo 在想修改的对象最后加上 NOPASSWD: ALL 注意:在后面的设置会覆盖前面的设置

  4. Android 使用AS编译出错:Error: Duplicate resources

    原因在于drawable目录下有重复的文件名!!! 修改其中的一个文件名或者删除其中一张图(或者xml文件)就可以啦~

  5. Python版常见的排序算法

    学习笔记 排序算法 目录 学习笔记 排序算法 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 7.堆排序 排序分为两类,比较类排序和非比较类排序,比较类排序通过比较 ...

  6. java文件的写入和读取(按行)

    https://blog.csdn.net/Alexwym/article/details/81078417 https://blog.csdn.net/nickwong_/article/detai ...

  7. IDEA_Shelve代码搁置与恢复

    日常开发中,经常会遇到在当前分支开发到一半,但是需要Checkout上个版本解决bug或调查问题的情况.这个时候,我们是将代码提到Push远程?还是直接Rollback? 最理想的做法,就是将当前的开 ...

  8. git提交限制后提交出错的暴力解决 (使用小乌龟)

    1.右键-> TortoiseGit-> 显示日志 2.右键->重置到哪个版本 3. 重新修改提交信息提交

  9. Prefrontal cortex as a meta-reinforcement learning system

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Nature Neuroscience, 2018 Abstract 在过去的20年中,基于奖励的学习的神经科学研究已经集中在经典模型上, ...

  10. WebApis中DOM操作的基本案例

    1.1. 排他操作 1.1.1 排他思想 如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法: 所有元素全部清除样式(干掉其他人) 给当前元素设置样式 (留下我自己) 注意 ...