在C++中,C++程序中头文件保护的目的是什么.
从net我发现这是为了防止包含文件一次又一次,但是如何保护头文件保证这一点.
放置#pragma once包含防护装置内部而不是外部防护装置之间有什么区别吗?
情况1:
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
#pragma once
Run Code Online (Sandbox Code Playgroud)
案例2:
#pragma once
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
Run Code Online (Sandbox Code Playgroud)
我只是出于好奇而想知道是否有任何特殊情况我应该更喜欢其中一个(案例1或案例2),因为我决定在我的代码中将两者(pragma和header guard)结合起来.
编辑:
我想你们都误解了我的问题......我问的是一个地方pragma once,而不是pragma曾经-vs-标题守卫.
默认情况下,CLion会将以下行添加到新创建的头文件中:
#ifndef SOME_NAME_H
#define SOME_NAME_H
.... your code here
#endif //SOME_NAME_H
Run Code Online (Sandbox Code Playgroud)
但我#pragma once更喜欢.如何配置CLion以便#pragma once默认使用新的头文件?
设置包含警卫的常规方法是什么?我通常把它们写成(例如h.h):
#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_
#include "example.h"
#endif
Run Code Online (Sandbox Code Playgroud)
强调约定是否重要?当我用Google搜索时,我看到了相互矛盾的信息.是否_EXAMPLE_H_甚至有相匹配的头的名称?
我总是把我的#include后 #ifdef/ #define包含卫队.现在我的IDE(Qt Creator)的重构机制将它放在Include-Guard之前,例如
#include "AnotherHeader.h"
#ifndef MYHEADER_H
#define MYHEADER_H
Run Code Online (Sandbox Code Playgroud)
这会导致任何问题,还是可以这样离开?
我目前正在执行以下操作,编译器(MSVC2008 /以及2010)没有抱怨它,但我不确定这是不是一个坏主意:
#ifndef FOO_H_
#define FOO_H_
// note, FOO_H_ is not a comment:
#endif FOO_H_
Run Code Online (Sandbox Code Playgroud)
我以前总是写它,#endif // FOO_H_但我发现自己今天不这样做,并认为它很奇怪,因为显然我暂时没有做评论方法.
这是不好的做法,我应该通过我的所有标题和修复(它是一个跨平台的应用程序)或者是否可以保持它的方式?
我目前正在攻读CS课程的期末考试,而且我遇到了一个关于C++ #ifndef语法的小问题(可能是主要的?).
当我将#infndef用作#include后卫时,我已经查看了#infndef的语法,网上的大多数人都说:
#ifndef HEADER_H
#define "header.h"
...
#endif
Run Code Online (Sandbox Code Playgroud)
但我班级的教程幻灯片显示的例子如下:
#ifndef __HEADER_H__
#define "header.h"
...
#endif
Run Code Online (Sandbox Code Playgroud)
我想知道两者之间的差异(如果有的话).考试很可能会让我写一个#include后卫,而且我知道传统的智慧只是与教授/导师所说的一致,但如果在编译过程中存在差异,我想知道.
使用clang-tidy运行静态分析时,是否可以删除建议的llvm-header-guard字符串上的建议的计算机特定路径?
例如,文件(cls / math / matrix.hpp)的建议头保护为:_USERS_NAME_DESKTOP_PROJECT_SRC_CLS_MATH_MATRIX_HPP
但为避免使其特定于我的计算机,它应该仅为:_PROJECT_SRC_CLS_MATH_MATRIX_HPP
有没有一种方法可以配置clang-tidy,从而建议从/ project /目录而不是/ users /目录开始的头文件保护?
我正在使用从cmake运行的clang 5.0.0。
在模板类中包含保护是明智的吗?
每次使用不同的实现引用它们时,是不是应该重新分析模板类?
NB在Visual C++ 2008中,我没有将两者结合起来的错误......
include-guards ×10
c++ ×7
header-files ×3
include ×3
c ×2
clang ×1
clion ×1
ios ×1
llvm ×1
llvm-clang ×1
objective-c ×1
pragma ×1
templates ×1