相关疑难解决方法(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万
查看次数

#include 在注释块之前或之后保护?

我在某处读到(抱歉,再也找不到链接了)在标题的第一行应该始终是 #include 保护,因为编译器可以在不打开头文件的情况下看到它。因此,如果头文件已经包含在内,它不会打开文件只是为了再次关闭它,这会加快构建过程。
但是我总是在每个文件的开头都有一个注释块。所以我的问题是,#include 守卫应该写在注释块之前还是之后?

这种风格更好吗:

///////////////////////
// Name:        code.h
// Author:      Me
// Date:        dd.mm.yyyy
// Description: This code executes a specific task
///////////////////////

#ifndef CODE_H_
#define CODE_H_

...

#endif
Run Code Online (Sandbox Code Playgroud)

或者这种风格更好:

#ifndef CODE_H_
#define CODE_H_

///////////////////////
// Name:        code.h
// Author:      Me
// Date:        dd.mm.yyyy
// Description: This code executes a specific task
///////////////////////

...

#endif
Run Code Online (Sandbox Code Playgroud)

或者根本就没有关系?

c++ performance compilation include-guards header-files

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