提问人:Tomáš Zato 提问时间:7/19/2023 更新时间:7/20/2023 访问量:92
是否可以告诉编译器只忽略特定的未知编译指示?
Is it possible to tell the compiler to only ignore specific unknown pragma?
问:
我不确定我在哪里第一次看到它,但我习惯于在类定义中使用和标记属于一起的部分,例如运算符实现。#pragma region region name
#pragma endregion
在 VS Code 和 Visual Studio 中,这允许你折叠整个部分,只保留名称可见。
但是,大多数编译器随后会引发未知编译指示警告。我可以通过调用在 gcc 中禁用它,但是如果我曾经需要受支持的编译指示并打错字,我不会收到警告。-Wno-unknown-pragmas
我想知道是否可以改为“将所有编译指示 XY 视为已知但无操作”,以便我可以获得其他编译指示的警告,但被忽略。region
endregion
答:
可能的解决方案
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 折叠。
结论
这个特定的用例可以通过使用插件来完成。然而,问题是关于一般的编译指示,而不是关于这个具体的编译指示。
要回答这个问题,您可以使用第一种方法(如果是一次性情况)或第二种方式(如果您知道您将经常使用某个编译指示)。
我想不出另一种方法,如果不检查特定于编译器的宏,因为编译指示根据定义取决于所使用的编译器,所以我希望这会有所帮助。
评论
clang
评论
_Pragma