问题标签 [include-guards]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
10970 浏览

c++ - #ifdef/#define Include-Guard 之前的#include 可以吗?

我总是把我#include的 放在#ifdef/ #defineInclude-Guard 之后。现在我的 IDE(Qt Creator)的重构机制把它放在 Include-Guard 之前,例如

这会导致任何问题还是我可以这样离开它?

0 投票
2 回答
3358 浏览

c - C Header include-guards 仅在头文件中使用,而不在 .c 文件中使用。为什么?

我在头文件中使用了一段时间的保护,我理解为什么使用它们的唯一原因是在编译时启用单个包含(头文件有考虑中的保护)。

我想知道是否还有其他原因使用标头保护,为什么它们不在 .c 文件中使用,如果保护也用于 .c 文件会发生什么?

答。从下面的回复中收集。

通常,所有定义都进入 .c 文件,头文件(.h 文件)包括所有声明。包含 .c 文件不是一个好习惯。

为了在编译特定于翻译单元的过程中仅关联一个包含在 .c 文件中可用的声明(因此,如果有两个或多个库需要链接;即,我们有两个或更多翻译单位);标头保护有助于仅包含一次标头文件。

发生这种情况是因为预处理器阶段甚至在编译文件以获取对象(.o 扩展名)文件之前。预处理器阶段替换整个宏并包含相关数据,这允许您的 .h 文件仅包含一次。

0 投票
2 回答
781 浏览

c++ - C++:通过简单的加法示例了解头文件和头文件

我无法理解头球和头球后卫。我已经阅读了其他问题及其答案,但我仍然无法在 Visual Studio 2013 中完成这项工作:

main.cpp

add.cpp

add.h

当我编译时,控制台窗口在屏幕上闪烁然后消失。错误列表包含:

错误 1 ​​错误 LNK2019:函数 _wmain c:\Users\Danny\documents\visual studio 2013\Projects\Addition Program\main 中引用的未解析外部符号“int __cdecl add(int,int)”(?add@@YAHHH@Z) \main.obj 主要

错误 2 error LNK1120: 1 unresolved externals c:\users\danny\documents\visual studio 2013\Projects\Addition Program\Debug\main.exe main


1. 头球和头球后卫是如何工作的?我看到 #include 是如何add.h知道main.cpp的声明的add(int x, int y),但是它是如何找到它的定义的呢?


2. 我的代码有什么问题?

我的代码现在正在编译。我的代码没有编译的原因是因为我一直在File > New > File...将文件添加到我的项目中,而不是通过Visual Studio中解决方案资源管理器的Source FilesHeader Files部分添加它们。我还需要添加到 add.cpp 文件中。#include "stdafx.h

0 投票
1 回答
148 浏览

c++ - #includes 和 Redundancies 在代码中的位置(头文件和实现文件)

我目前正在使用 Accelerated C++ 并且我在理解我必须将#include 放在哪里(无论是在头文件和/或源文件中)以及主要是我是否是多余的方面有点困难。

我会很感激所有关于我应该改变什么和没有必要改变的评论。我觉得我多次包含库(例如,如果主程序有#include,我是否需要在任何其他头文件/源文件中包含它?)。此外,如果使用

并且Student_info.cpp 文件包含grade.h,我还需要在main.cpp 中包含grade.h 还是这样就足够了?我发布此代码是因为我认为将应用程序应用于特定示例将是在我的脑海中钻研组织这些文件的正确方法以及我应该注意的常见错误的最佳方式

文件列表 - 为了完整起见,我包含了整个代码,但只有最重要的部分和原则才是真正重要的

主文件

等级.h

等级.cpp

分析.h

分析.cpp

中位数.h

中位数.cpp

学生信息.h

学生信息.cpp

0 投票
1 回答
61 浏览

c++ - 包括问题和包括警卫

我和我的团队正在开发一个非常大的项目,其中包含许多类,它们各自的头文件和源文件。我们正在尝试将 C++ 库和项目类头文件中的所有包含合并到一个名为“Includes.h”的文件中,该文件包含在每个头文件中。这样做时我遇到的一个问题是类头文件基本上包括它们自己。我已经包含#pragma once在每个头文件的顶部。#include "Controller.h"当我在“#Includes.h”文件中注释掉时,“Controller.h”的错误就会消失。

0 投票
1 回答
49 浏览

include - 为什么有些包含守卫具有定义的值?

通常在使用包含守卫时,我会这样写:

现在在一些图书馆中,我看到了类似的东西:

经过一番研究,我没有找到任何理由说明为什么需要初始化 include-gurad。

这样做有什么理由吗?

0 投票
1 回答
390 浏览

c++ - 在包含保护中包含其他标头会导致错误

0 投票
5 回答
2968 浏览

c - C 语言,正确使用包含守卫

我正在尝试创建一个头文件(其中将包括我为 AVL 树编写的函数),但我对包含保护的语法有一个小问题和误解。

现在我的代码看起来像这样

问题是,我认为它只包括<stdio.h>. 当我尝试使用 malloc 时,它说 malloc 未定义,即使我包含了 stdlib。

根据http://www.cprogramming.com/reference/preprocessor/ifndef.html,如果我理解正确,ifndef 检查令牌是否已定义,如果未定义,它定义我在 ifndef 之后和#endif 之前编写的所有内容。所以我的代码应该可以工作。

是否定义了 stdio?不。所以定义它。万一。定义了标准库吗?不。所以定义它。万一。conio 定义了吗?不。所以定义它。万一。我没有看到问题。

如果我想添加这 3 个标题,正确的语法是什么?

0 投票
2 回答
1345 浏览

c++ - c ++模板并包含警卫

我对 C++ 比较陌生,所以我的问题可能有一个简单的答案;但是,我不知道为什么我的代码在我认为应该工作的时候不能工作。示例代码如下。





我一直在在线阅读有关如何在包含模板时避免错误的信息。其中之一就是我想在这里实现的目标:拥有#include "a.cpp"in a.h. 但是,我查看的示例仍然使用#include "a.h"in a.cpp,如示例代码中所示。但是,我得到了function template has already been defined错误。我发现在 a.cpp 中使用#ifdef A并注释掉#include "a.h"将帮助我摆脱这个重新定义的错误。但我想了解发生了什么。重新定义不应该已经由 include 守卫处理了a.h吗?

0 投票
2 回答
149 浏览

c++ - 既然其他可滥用但有用的功能已经标准化,为什么不 #pragma once 呢?

几乎所有 C++ 编译器都实现了非标准#pragma once功能,但 C++ 标准将其排除在外。

C++ 标准中排除了为什么#pragma once或某些语言结构的通常解释是硬链接和复制的头文件会破坏或激发编译器的启发式。公平地说,启发式算法通常与 C++ 哲学不兼容,但关于简单的破坏:有许多有用的语言特性可以破坏,不仅. 管理此类损坏的正常 C++ 方法是让编译器在可疑情况下发出可选警告。毕竟,C++ 的设计目的是让一个程序在希望这样做时不安全和/或不可移植。此外,它的不安全性和/或不可移植性非常小。只是没那么容易被滥用。#pragma once#pragma once#pragma once#pragma once

当通常包含其他可滥用但有用的语言功能时,为什么将其#pragma once排除在标准之外? 有什么特别之处吗?#pragma once

另外,在哪里可以阅读标准委员会最近对此事的审议?是否有某个委员会成员或委员会追随者发表了最近的辩论摘要?