利用预编译解决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. Flutter 容器(5) - SizedBox

    SizedBox: 两种用法:一是可用来设置两个widget之间的间距,二是可以用来限制子组件的大小. import 'package:flutter/material.dart'; class Au ...

  2. 聊聊Java内省Introspector

    前提 这篇文章主要分析一下Introspector(内省,应该读xing第三声,没有找到很好的翻译,下文暂且这样称呼)的用法.Introspector是一个专门处理JavaBean的工具类,用来获取J ...

  3. 火题小战 C. 情侣?给我烧了!

    火题小战 C. 情侣?给我烧了! 题目描述 有 \(n\) 对情侣来到电影院观看电影.在电影院,恰好留有 \(n\) 排座位,每排包含 \(2\) 个座位,共 \(2×n\) 个座位. 现在,每个人将 ...

  4. 真正从底层理解 Synchronized 实现原理

    实现synchronized的基础有两个:Java 对象头和 Monitor. 在虚拟机规范中定义了对象在内存中的布局,主要由以下 3 部分组成: 对象头 实例数据 对齐填充 而synchronize ...

  5. C++ IO的一些注意点

    读入这个坑一直以来都深受其麻烦,把遇到一些注意点记一下吧. 1.getchar读入 以前练线段树的时候做到Acwing#246 Interval GCD(原题在CodeHunter上,人懒就在Acwi ...

  6. 在服务器上使用python-gym出现的显示问题

    参考链接: http://www.luyixian.cn/news_show_392045.aspx https://www.cnblogs.com/cenariusxz/p/12666938.htm ...

  7. 服务器里Centos 7安装KVM,并通过KVM安装Centos 7

    一.安装KVM 1.进入系统后,检查cpu参数是否支持虚拟化: [root@localhost ~]# grep -Ei 'vmx|svm' /proc/cpuinfo 如果有出现vmx或者svm关键 ...

  8. 每日一学-python calendar

    python模块之calendar方法详细介绍 1.首先我们看下calendar的内置函数和相关的属性: import calendar dir(calendar) ['Calendar', 'EPO ...

  9. 从零开始的SpringBoot项目 ( 六 ) 整合 MybatisPlus 实现代码自动生成

    1.添加依赖 <!-- MySQL数据库 --> <dependency> <groupId>mysql</groupId> <artifactI ...

  10. Java面试题(网络篇)

    网络 79.http 响应码 301 和 302 代表的是什么?有什么区别? 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移. 区别: 301 redirect: 301 代表永 ...