为什么每个.h文件都以#ifndef #define #endif开头?我们当然可以在没有这些指令的情况下编译程序.
PHP中是否有一种方法可以尝试包含文件,但是如果文件包含阻止编译的错误,则只是从包含中跳过该文件?
我有这样的C++文件
#ifndef _MOVE_H
#define _MOVE_H
class Move {
int x, y;
public:
Move(int initX = 0, int initY = 0) : x(initX), y(initY) {}
int getX() { return x; }
void setX(int newX) { x = newX; }
int getY() { return y; }
void setY(int newY) { y = newY; }
};
#endif
Run Code Online (Sandbox Code Playgroud)
很让我惊讶,所有的代码#ifndef,并#endif简单地由编译器(我发誓,我没有界定忽视_MOVE_H其他地方),我有失踪定义的各种错误.我在想我做错了什么,但是当我尝试使用另一个键时(比如_MOVE_Ha,一切都恢复正常.这是否_MOVE_H意味着C++中的一些特殊内容?
我正在运行Ubuntu 10.04,GCC 4.4.3,如果这很重要的话.
谢谢,
我知道为什么包含警卫,这#pragma once不是标准的,因此不受所有编译器等的支持.
我的问题是另一种:
有没有明智的理由让它们没有?我还没有遇到这样一种情况,理论上,如果不在其他地方包含文件中提供包含警卫,那将会有任何好处.有没有人有一个例子,没有它们的实际好处?
我问的原因 - 对我来说,他们似乎非常多余,因为你总是使用它们,并且行为#pragma once也可以自动应用于字面上的一切.
在 clang tidy 中,检查[llvm-header-guard]查找 LLVM 样式的头保护,但我找不到任何正确的 LLVM 头保护样式的示例,特别是给定名称的结构,编码标准页面没有提到任何东西。
我想知道是否/什么包括文件一样守卫windows.h,math.h,iostream,stdio...等等.
因为我在不同的文件中多次包含这些标题.这些文件是否内置了防护装置或是否定义了定义?
我只是想知道这种标准的标准是什么.
它是使用您的任何一种选择好的做法/既包括警卫和#pragma once在每一个头文件,或者只是那些东西,例如类的声明?
我很想把它放在每个标题中,但我担心它会不需要,只会增加编译时间.什么是良好做法或共同做什么?
让我澄清一下:我理解两者之间的区别.我问的是,经验丰富的程序员是在每个文件中使用它还是只在需要它的文件中使用它.
我有一个关于在C中包含警卫的问题.我已经做了一些阅读,但我会欣赏一点澄清.
假设我有一个带有函数定义的头文件"header.h".
#ifndef HEADER_FILE
#define HEADER_FILE
int two(void){
return 2;
}
#endif
Run Code Online (Sandbox Code Playgroud)
这个头文件有一个包含保护.但是,我对#define HEADER_FILE实际上在做什么感到困惑.假设我忘记了包含守卫,完全忽略添加'#define HEADER_FILE'对我来说是完全合法的.
所以我的问题是:当我们定义HEADER_FILE时,我们到底在做什么?我们定义了什么?为什么忘记包含警卫是可以的,在这种情况下我们也忘了添加#define HEADER_FILE?
任何帮助表示赞赏!
我听说您应该更喜欢编写内部包含守卫而不是外部包含守卫。
我在互联网上搜索过,但没有找到答案。
这是 Herb & Andrei 所著的 C++ Coding Standards 一书的片段,其中显示了“外部包含保护”:
避免使用旧书中提倡的过时的外部包含保护:
#ifndef FOO_HJNCLUDED_ //NOT recommended
#include "foo.h"
#define FOO_HJNCLUDED_
#endif
Run Code Online (Sandbox Code Playgroud)
现在,这导致了以下问题:
问:
什么是内部包含保护,什么是外部包含保护?两者之间有什么区别,为什么首选内部包含守卫?
我希望答案也提供了一个例子。
编辑:我最终回答了我自己的问题。
这可能是一个非常愚蠢的问题,但我需要确定.我在头文件中得到了一个类声明,例如.
#ifndef file_H
#define file_H
class ex{
private:
public:
};
#endif
Run Code Online (Sandbox Code Playgroud)
我已经被要求在相同的文件中编写方法定义,我已经完成了,我的问题是"#endif"是否保留在类声明之后的位置,还是在文件末尾之后.类方法定义?
include-guards ×10
c++ ×8
header-files ×3
c ×2
include ×2
clang-tidy ×1
gcc ×1
llvm ×1
llvm-clang ×1
macros ×1
php ×1
pragma ×1
runtime ×1