是否可以告诉编译器只忽略特定的未知编译指示?

Is it possible to tell the compiler to only ignore specific unknown pragma?

提问人:Tomáš Zato 提问时间:7/19/2023 更新时间:7/20/2023 访问量:92

问:

我不确定我在哪里第一次看到它,但我习惯于在类定义中使用和标记属于一起的部分,例如运算符实现。#pragma region region name#pragma endregion

在 VS Code 和 Visual Studio 中,这允许你折叠整个部分,只保留名称可见。

但是,大多数编译器随后会引发未知编译指示警告。我可以通过调用在 gcc 中禁用它,但是如果我曾经需要受支持的编译指示并打错字,我不会收到警告。-Wno-unknown-pragmas

我想知道是否可以改为“将所有编译指示 XY 视为已知但无操作”,以便我可以获得其他编译指示的警告,但被忽略。regionendregion

C++ GCC C++17 编译指示

评论

0赞 Jarod42 7/19/2023
也许根据编译器演示来玩自定义定义。虽然没有成功传递区域名称。_Pragma

答:

1赞 Michał Gagoś 7/19/2023 #1

可能的解决方案

Microsoft Visual Studio 添加了一个宏。 您只能使用 when is defined 进行指定。_MSC_VER#pragma region name_MSC_VER

#ifdef _MSC_VER
#pragma region name
#endif
// Your code
#ifdef _MSC_VER
#pragma endregion
#endif

还可以使用该属性创建仅在使用 Microsoft 编译器(或任何其他编译器,如果您知道它设置的宏)时才会定义的宏。

但是,Visual Studio 似乎无法识别为 与 相同的东西。_Pragma("region name")#pragma region name

#ifdef _MSC_VER
#   define REGION(name) _Pragma(#name)
#   define REGION_END() _Pragma("endregion")
#else
#   define REGION(name)
#   define REGION_END()
#endif

REGION(region name) // expands to _Pragma("region name")
   // Your code
REGION_END() // expands to _Pragma("endregion")

进一步研究

经过一番思考,我决定检查区域编译指示是否真的对生成的汇编指令有任何影响。我尝试了几个简单的例子,似乎它没有改变任何东西。有趣的是,我发现 clang 和 GCC 13 通过简单地忽略这个特定的编译指示来实现他们的支持。

这意味着 IDE 只需分析文件内容并查找区域编译指示即可实现该行为。

这就解释了为什么我尝试的第二种方法不起作用。它正确地设置了编译指示,但 IDE 只是在寻找扩展到的宏,而是在寻找。据我所知,不可能创建一个扩展为 ._Pragma("region name")#pragma region name#pragma region name

使用编译指示是实现纯可视化 IDE 功能的一种非常奇怪的方式。我找不到任何充分的理由让它变成这样。然而,有趣的是,Xcode 有一个 它可以让你在 Objective-C 代码中标记特定的行,所以我敢打赌,在编译指示疯狂背后有一个很好的理由。#pragma mark name

幸运的是,有一些 Visual Studio 插件可以使用注释实现相同的结果。
我发现的一个是 VS Code 的 #region 折叠。

结论

这个特定的用例可以通过使用插件来完成。然而,问题是关于一般的编译指示,而不是关于这个具体的编译指示。

要回答这个问题,您可以使用第一种方法(如果是一次性情况)或第二种方式(如果您知道您将经常使用某个编译指示)。

我想不出另一种方法,如果不检查特定于编译器的宏,因为编译指示根据定义取决于所使用的编译器,所以我希望这会有所帮助。

评论

0赞 Tomáš Zato 7/19/2023
这当然是可行的,但它在某种程度上违背了在第一种情况下拥有这些编译指示的便利目的。
0赞 Michał Gagoś 7/19/2023
本文建议区域编译指示已在 gcc 13 中实现,但我在更新说明中找不到任何提及它的内容。gcc.gnu.org/bugzilla/show_bug.cgi?id=85487
0赞 Tomáš Zato 7/19/2023
是的,我在发布这个问题后发现了那个讨论。根据那里所说的,已经支持这一点。但是,知道如何做到这一点对于其他编译指示来说也是很巧妙的,例如当针对嵌入式或其他一些具有自己编译指示的奇怪平台时。clang
0赞 Michał Gagoś 7/19/2023
你是对的,我不知道类似函数的宏可能是空的。
1赞 Tomáš Zato 7/24/2023
感谢所有的研究。我可能会尝试设置 CMAKE,以便仅对于尚不支持它的编译器忽略编译指示。