那些域名可以做后缀做网站,做企业网站有哪些好处,视频制作平台,如何将百度地图加入网站概要
代码编译过程中#xff0c;为了防止同一份代码被重复引用#xff0c;通常有两种实现方式
方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下#xff0c;使用上述两种方式中的任意一种都是可以的。最近工作中#xff0c;代…概要
代码编译过程中为了防止同一份代码被重复引用通常有两种实现方式
方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下使用上述两种方式中的任意一种都是可以的。最近工作中代码按照其功能性被划分出不同的模块这时二者的区别就体现出来了。
模块依赖图 Submodule1和submodule2是两个独立的模块相互见不可见两个模块均存在同一个接口文件Interface BClass E同时依赖Submodule1和submodule2
实验
如果在Interface B文件中使用pragma once在编译环节会有如下的报错 error: redefinition of XXX // Interface B文件中实现的一个数据结构 struct XXX{ 但是使用ifndef不会报错且代码运行符合预期。
区别
pragma once只是保证同一个文件不会被引用两次但是对于不同的文件即时文件名和内部实现完全一致该语法是不生效的。
Ifndef其实是定义一个宏即时在不同的文件中出现相同的宏名它也有排他性。 链接的问题
由于submodule1和submodule2是分开编译的因此编译出的静态库文件均包含了类xxx的实现。在编译外部的可执行目标class E的过程中无疑它也包含了类xxx的实现。当这三部分进行链接时肯定是存在重复的部分的。与编译器不同的是链接器它能通过symbol的名称进行排重只会选取一个因此不再报错。 参考文献
C学习笔记之pragma once的理解_pragma once什么意思-CSDN博客https://www.cnblogs.com/math/p/how_to_resolve_multi_define_symbols.html