#pragma 如何移植?

How can #pragma be portablized?

是否可以移植所有 #pragma 命令? #pragma once 可以移植如下:

#ifndef FOO
#define FOO
//Code here
#endif

但是,我不知道 #pragma pack 和其他人的通用实施。这可能吗?

否,pragma 实现留给预处理器或编译器作者,未在 C++ 标准中指定。

参见https://isocpp.org/std/the-standard

它比人们预期的更容易阅读。

您发布的内容不会导致完全相同的行为。 VS中的#pragma once 不等同于你写的包含保护#ifdef。

标准中的 pragma 规范本质上是一个实现定义的挂钩 - 每个 pragma 的结果都是实现定义的。结果可能包括导致翻译失败、执行或发出的代码以不符合标准的方式运行(即使用任何代码构造与标准要求不同)。实现需要忽略它们无法识别的编译指示。

因此,根据定义,没有通用的定义。也没有什么可以阻止两个不同的编译器使用相同的编译指示做完全不同的事情。

对于"portabilize"这样的事情,有必要对编译器供应商可以实现的特性和行为有一个一致的规范(然后,程序员可以一致地使用)。获得这样的规范具有挑战性,但并非不可能。首先,需要共享规范 - 正式(例如在标准中)或非正式(例如一些供应商之间商定的规范,即使它实际上不在标准中)。其次,它要求所有供应商同意实施它——这不是给定的,即使它是在批准的标准中。第三,它需要理解实现之间的任何差异,并为开发人员所接受(或至少,合理的多数)。

当多个参与者(供应商、开发人员、委员会,等等)之间需要达成协议时,需要付出更多的努力才能达成一致。使用 C++,没有人有足够的 "pull" 来保证某些功能会成功 "portabilized" - 或者,换句话说,没有人可以说服拥有王牌选票的人做出普遍的东西。获得 100% "portabilization" 将很难 - 实际上,通常会有 "near enough" 结果而不是 100%.