我一直在头文件的开头看到这样的代码:
#ifndef HEADERFILE_H
#define HEADERFILE_H
Run Code Online (Sandbox Code Playgroud)
并在文件的最后是
#endif
Run Code Online (Sandbox Code Playgroud)
这样做的目的是什么?
我已经读过使用时会有一些编译器优化,#pragma once这会导致更快的编译.我认为这是非标准的,因此可能造成跨平台兼容性问题.
这是非Windows平台(gcc)上大多数现代编译器支持的东西吗?
我想避免平台编译问题,但也想避免后备警卫的额外工作:
#pragma once
#ifndef HEADER_H
#define HEADER_H
...
#endif // HEADER_H
Run Code Online (Sandbox Code Playgroud)
我应该担心吗?我是否应该在这方面进一步消耗精力?
考虑以下内联函数:
// Inline specifier version
#include<iostream>
#include<cstdlib>
inline int f(const int x);
inline int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
Run Code Online (Sandbox Code Playgroud)
和constexpr等效版本:
// Constexpr specifier version
#include<iostream>
#include<cstdlib>
constexpr int f(const int x);
constexpr int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:说明constexpr符是否意味着说明inline符,如果一个非常量参数传递给一个constexpr函数,编译器将尝试inline该函数,就像说明inline符被放入其声明一样?
C++ 11标准能保证吗?
告诉编译器只包含一次文件有什么意义?默认情况下它不会有意义吗?是否有任何理由多次包含单个文件?为什么不假设呢?是与特定硬件有关吗?
所以我最近讨论了我的工作,其中我质疑使用双重防守对一名后卫的影响.双防护的意思如下:
头文件"header_a.hpp":
#ifndef __HEADER_A_HPP__
#define __HEADER_A_HPP__
...
...
#endif
Run Code Online (Sandbox Code Playgroud)
将头文件包含在头文件或源文件中的任何位置时:
#ifndef __HEADER_A_HPP__
#include "header_a.hpp"
#endif
Run Code Online (Sandbox Code Playgroud)
现在我明白在头文件中使用guard是为了防止多次包含已经定义的头文件,这是常见的并且有很好的文档记录.如果已经定义了宏,则编译器会将整个头文件视为"空白",并防止双重包含.很简单.
我不明白的问题是使用#ifndef __HEADER_A_HPP__和#endif围绕着#include "header_a.hpp".同事告诉我,这为夹杂物增加了第二层保护,但是如果第一层绝对完成工作(或者它是什么?),我看不出第二层是如何有用的.
我能想到的唯一好处是它可以直接阻止链接器找到文件.这是否意味着改善编译时间(没有提到作为一个好处),或者在这里有什么其他工作我没有看到?
有许多超薄笔记本电脑,价格便宜,使用方便.编程具有在任何存在沉默和舒适的地方完成的优点,因为长时间集中是能够进行有效工作的重要因素.
我有点老式,因为我喜欢我的静态编译的C或C++,这些语言可以很长时间在那些功耗受限的笔记本电脑上编译,特别是C++ 11和C++ 14.
我喜欢做3D编程,我使用的库可能很大而且不会宽容:子弹物理,Ogre3D,SFML,更不用说现代IDE的功耗了.
有几种解决方案可以使构建更快:
解决方案A:不要使用那些大型库,并提出更轻松的东西来减轻编译器的负担.编写适当的makefile,不要使用IDE.
解决方案B:在其他地方设置构建服务器,在肌肉发达的机器上设置makefile,并自动下载生成的exe.我不认为这是一个随意的解决方案,因为你必须瞄准你的笔记本电脑的CPU.
解决方案C:使用非官方的C++模块
???
还有其他建议吗?
我的一些头文件没有包含,所以我在Visual Studio 2010中收到此消息:
IntelliSense: PCH warning: cannot find a suitable header stop location. An intellisense PCH file was not generated.
Run Code Online (Sandbox Code Playgroud)
如果我添加一个标头,例如:
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
它消失了.如何在不添加(可能未使用)include>的情况下停止显示此错误
在编写模板化类时,我喜欢将实现移动到另一个文件(myclass.tpp)中并将其包含在主标题(myclass.hpp)的底部.
我的问题是:我是否需要在.tpp文件中包含保护,或者将它们放在.hpp文件中是否足够?
示例代码:
myclass.hpp
#ifndef MYCLASS_HPP
#define MYCLASS_HPP
template<typename T>
class MyClass
{
public:
T foo(T obj);
};
//include template implemetation
#include "myclass.tpp"
#endif
Run Code Online (Sandbox Code Playgroud)
myclass.tpp
#ifndef MYCLASS_TPP //needed?
#define MYCLASS_TPP //needed?
template<typename T>
T MyClass<T>::foo(T obj)
{
return obj;
}
#endif //needed?
Run Code Online (Sandbox Code Playgroud) 可能重复:
#pragma一次vs包括警卫?
使用#pragma once和#if !defined MYHEADER_INCLUDED_构造有何不同(性能,可用性和功能性)?或者两者有什么区别?
放置#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-标题守卫.