10

有人可以告诉我#pragma once为各种编译器提供指令支持的解决方法吗?

我想在我的标题中使用如下内容:

#if _MSC_VER > ... || __GNUC__ > ... || ...

#pragma once

#endif

也许它已经存在于提升源或您的代码中?

4

3 回答 3

20

使用包括警卫

#ifndef MY_HEADER_H
#define MY_HEADER_H

// ...

#endif    // MY_HEADER_H

有时你会看到这些结合使用#pragma once

#pragma once

#ifndef MY_HEADER_H
#define MY_HEADER_H

// ...

#endif    // MY_HEADER_H

#pragma once得到相当广泛的支持

于 2012-08-27T19:32:10.037 回答
6

#pragma once是包含警卫的非标准替代方案:

#ifndef HEADER_H
#define HEADER_H

//contents of header

#endif

两者都确保标题内容不会在同一个翻译单元中多次粘贴。

于 2012-08-27T19:31:15.337 回答
1

我自己喜欢使用传统的包含警卫(如接受的答案所建议的那样)。这实际上并没有那么多工作,而且您获得了 100% 可移植性的好处。如果您正在编写库、发布代码示例等,最好使用老式语法以避免其他人遇到麻烦。

也就是说,这里的其他人也指出,绝大多数现代编译器都尊重该#pragma once指令,因此您在自己的项目中使用它的可能性相对较小。

维基百科有一个支持该指令的编译器列表:

https://en.wikipedia.org/wiki/Pragma_once#Portability

于 2022-01-28T00:28:28.427 回答