是否可以对所有#pragma
命令进行移植? #pragma once
可以按以下方式移植:
#ifndef FOO
#define FOO
//Code here
#endif
但是,我不知道#pragma pack
和其他人的通用实现。这可能吗?
答案 0 :(得分:2)
标准中的pragma规范本质上是一个实现定义的钩子 - 每个pragma的结果都是实现定义的。结果可能包括导致转换失败,实现或发出的代码以不符合的方式运行(即,使用任何代码构造的事情与标准要求不同)。实现需要忽略他们不认识的编译指示。
因此,根据定义,没有通用的定义。也没有什么能阻止两个不同的编译器使用相同的编译指示完成不同的事情。
To" portabilize"这样的事情,有必要对编译器供应商可以实现的特性和行为有一致的规范(然后,程序员可以一直使用)。获得这样的规范很有挑战性,但并非不可能。首先,需要共享规范 - 正式(例如在标准中)或非正式地(例如,某些供应商之间商定的规范,即使它实际上不在标准中)。其次,它要求所有供应商同意实施它 - 即使它是在批准的标准中,也不是给定的。第三,它要求实现之间的任何变化都要被理解,并被开发人员接受(或者至少是合理的多数)。
当多个参与者(供应商,开发商,委员会,列表继续)之间需要达成协议时,需要付出更多努力来达成协议。使用C ++,没有足够的" pull"保证某些功能能够成功并且安全化#34; - 或者,换句话说,没有任何一个有特朗普投票权的人可以说服他们做出一些普遍的事情。获得100%"安全化"会很难 - 实际上,经常会有一个足够的"结果而不是100%。
答案 1 :(得分:1)
不,编译指示实现由预处理器或编译器作者完成,并且未在C ++标准中指定。
请参阅https://isocpp.org/std/the-standard。
阅读比人们预期的更容易。
您发布的内容不会产生完全相同的行为。 VS中的#pragma一次不等于你写的包含守卫#ifdef。