我正在研究一个已知只能在Windows上运行并在Visual Studio下编译的代码库(它与excel紧密集成,所以它不会去任何地方).我想知道我是否应该使用传统的包含警卫或#pragma once用于我们的代码.我认为让编译器处理#pragma once会产生更快的编译,并且在复制和粘贴时不易出错.它也稍微不那么难看;)
注意:为了获得更快的编译时间,我们可以使用Redundant Include Guards,但这会在包含的文件和包含文件之间增加紧密耦合.通常它没关系,因为防护应该基于文件名,并且只有在你需要改变包含名称时才会改变.
传统上,避免C++中多个头部包含的标准和可移植方法是使用#ifndef - #define - #endif预编译器指令方案,也称为宏保护方案(参见下面的代码片段).
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
Run Code Online (Sandbox Code Playgroud)
然而,在大多数实现/编译器中(见下图),有一个更"优雅"的替代方案,其功能与调用的宏保护方案相同#pragma once.#pragma once与宏保护方案相比具有几个优点,包括更少的代码,避免名称冲突,有时提高编译速度.

做了一些研究,我意识到尽管#pragma once几乎所有已知的编译器都支持指令,但是指令是否#pragma once是C++ 11标准的一部分还是存在紊乱.
#pragma once指令是否属于C++ 11标准的一部分吗?#pragma once)的优点/缺点,那也是很好的.我正在使用第三方开源应用程序来执行我认为很奇怪的事情.我想听听你对你是否认为这是错误/邪恶/憎恶/等的看法,或者是否有合理的理由这样做.
简单地说,他们使用#include pre-proc指令来包含包含代码片段的"头文件".不是函数的原型.不是内联功能.只是代码的一部分.
这是一个简单的例子.首先是main.cpp文件:
#include <iostream>
//Other "normal" includes here...
int main(int argc, char *argv[]) {
cout << "Initializing program..." << endl;
#include "parseArgs.h"
// ... remainder of the program
cout << "Exiting." << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并且在parseArgs.h头文件中,有一个小代码片段.请注意,这只是parseArgs.h文件中的内容.这不是功能的一部分.没有包含警卫,只有以下4行:
argList args(argc, argv);
if(!args.valid()) {
cout << "Invalid arguments.";
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
在真实的程序中,有几个#include指令,每个指令执行另一个小任务.
这似乎是危险和疯狂的.我不知道他们为什么不写作并将其称为函数.
你的想法和意见?
c++ ×4
c ×1
c++11 ×1
c++14 ×1
coding-style ×1
gcc ×1
header-files ×1
include ×1
macros ×1
preprocessor ×1