相关疑难解决方法(0)

#pragma曾经vs包括守卫?

我正在研究一个已知只能在Windows上运行并在Visual Studio下编译的代码库(它与excel紧密集成,所以它不会去任何地方).我想知道我是否应该使用传统的包含警卫或#pragma once用于我们的代码.我认为让编译器处理#pragma once会产生更快的编译,并且在复制和粘贴时不易出错.它也稍微不那么难看;)

注意:为了获得更快的编译时间,我们可以使用Redundant Include Guards,但这会在包含的文件和包含文件之间增加紧密耦合.通常它没关系,因为防护应该基于文件名,并且只有在你需要改变包含名称时才会改变.

c++ coding-style

343
推荐指数
10
解决办法
19万
查看次数

#pragma曾经是C++ 11标准的一部分吗?

传统上,避免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标准的一部分吗?
  • 如果它不是C++ 11标准的一部分,是否有计划将其包含在以后的版本中(例如,C++ 14或更高版本)?
  • 如果有人可以进一步详细说明使用这些技术中的任何一种(即,宏观防护对比#pragma once)的优点/缺点,那也是很好的.

c++ macros header-files c++11 c++14

137
推荐指数
2
解决办法
4万
查看次数

为什么要包括警卫?

这里定义的包含保护用于防止在编译时加载相同的代码两次.

为什么我的编译器(GCC)无法检测到它正在加载相同的代码两次并且具有合理的默认行为?

c c++ compiler-construction gcc preprocessor

15
推荐指数
3
解决办法
2109
查看次数

使用#include包含代码部分

我正在使用第三方开源应用程序来执行我认为很奇怪的事情.我想听听你对你是否认为这是错误/邪恶/憎恶/等的看法,或者是否有合理的理由这样做.

简单地说,他们使用#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++ include

5
推荐指数
1
解决办法
1722
查看次数