博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《C预处理》之#ifndef
阅读量:4180 次
发布时间:2019-05-26

本文共 1135 字,大约阅读时间需要 3 分钟。

1.test.h

#ifndef TEST_H#define TEST_H/*这里只是说明,在头文件中定义变量是不被推荐的。*/int a = 0;int b = 0;int c = 0;int test();#endif
注意:#ifndef只能防止.h文件被同一个C文件重复包含;不能保证两个C文件对其两次包含,所以如果被一个模块(编译成一个so或bin)中两个c同时包含、并且h文件中有上述定义(非声明)。编译系统就会在链接阶段出错。换句话说:#ifndef是在编译阶段起作用。

这告诉我们:永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分频操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其他模块寻找外部函数和变量。

但仍然需要注意:声明不一定不是定义,但定义一定是定义!因为有的编译器在int a时已经分配内存,并给予一个零值;但extern一定只是声明。

2.test.c

#include 
/*如下头文件包含后报错cc -c main.c test.hcc -c test.c test.hcc -o main main.o test.otest.o:(.bss+0x0): multiple definition of `a'main.o:(.bss+0x0): first defined heretest.o:(.bss+0x4): multiple definition of `b'main.o:(.bss+0x4): first defined heretest.o:(.bss+0x8): multiple definition of `c'main.o:(.bss+0x8): first defined here*///#include "test.h"extern int a;extern int b;extern int c;int test(){ a = 5; b = 3; c = 100; printf("aadda\n"); return 0;}
extern关键字是在模块间链接阶段起作用。

3.main.c

#include "test.h"#include 
int main(){ a = 5; b = 3; c = 10; printf("aadda\n"); test(); return 0;}

4.Makefile

objects = main.o test.odefault:	cc -c main.c	cc -c test.c	cc -o main $(objects)clean:	rm *.o main

转载地址:http://qegai.baihongyu.com/

你可能感兴趣的文章
RAP一种更高效的前后端接口对接解决方案
查看>>
ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
查看>>
ELK搭建教程(全过程)
查看>>
maven私服搭建使用
查看>>
Netty学习路线总结
查看>>
基于mybatis拦截器实现数据权限
查看>>
分布式文件系统FastDFS详解
查看>>
centos7上rabbitmq搭建
查看>>
rabbitmq集成spring的xml配置和java代码
查看>>
RabbitMQ消息确认(发送确认,接收确认)
查看>>
一篇笔记整理JVM工作原理
查看>>
activemq、rabbitmq、kafka原理和比较
查看>>
秒杀系统设计思路和实现方法
查看>>
Redis常见面试题
查看>>
JDK重要包和Java学习方法论
查看>>
网络通讯中的三次握手与四次挥手原理详解
查看>>
GitHub 开源神器:图片秒变文件
查看>>
openstack ice resize 详解(三)
查看>>
事务与锁(转)
查看>>
Namenode HA原理详解(脑裂)
查看>>