gpt4 book ai didi

c++ - 确保每个字符串文字都包含在宏中

转载 作者:太空狗 更新时间:2023-10-29 22:54:36 27 4
gpt4 key购买 nike

我想用宏包装项目中的每个字符串文字。我想确保我的项目中的每个字符串文字都用宏包装,并且有一些外部工具帮助我找到没有包装在宏中的字符串文字的位置。

有什么方法可以使用 Clang 插件来确保每个字符串文字都包含在宏中?

我要处理的案例:

  1. #define MY_ASSERT(Y) {if(!(Y)) throw Exception(#Y); }

    #Y 应该被警告为未包装的字符串文字。

  2. "a" "b" "c"

    它要求整个事情都在一个宏中,像这样:

    MY_STR("a" "b" "c")

我如何使用 Clang 插件做到这一点,或者是否有其他一般方法可以做到这一点?

最佳答案

您可以使用 DMS 软件再造工具包及其 C++ 前端来做到这一点。

DMS 可以根据 C++ 的显式语法定义(处理 GCC 和 MS 方言中的 C++17)来读取源代码,构建 AST,应用提供的重写规则来修改树,然后将 AST 漂亮地打印回源代码文本、保留注释、文本对齐、数字基数等。

为此,您只需要一个 DMS 规则(有关详细信息,请参阅 DMS Rewrite Rules):

rule wrap_string_in_macro(s:string_literal):primary_expression->primary_expression
= "\s" -> " my_macro_name(\s) ";

非终结符 string_literal 涵盖了各种各样的 C++ 字符串(8 位、ISO、宽、原始、字符串序列……)所以你不必担心它们,这个规则会接他们。但是您的宏可能需要担心这些。因此,可以说您可以编写一组更大的规则,以便专门化宏调用:

rule wrap_ISO_string_in_macro(s:ISO_STRING_LITERAL):primary_expression->primary_expression
= "\s" -> " my_macro_name_for_ISO_string(\s) ";

rule wrap_ISO_string_in_macro(s:WIDE_STRING_LITERAL):primary_expression->primary_expression
= "\s" -> " my_macro_name_for_wide_string(\s) ";

...

这些规则将选取单独的字符串,但这留下了处理字符串序列的问题:

rule wrap_ISO_string_list_in_macro(seq: string_literal_list,s:ISO_STRING_LITERAL):primary_expression->primary_expression
= " \string_literal_list \s" -> " my_macro_name_for_ISO_string_list(\s) ";

...

关于c++ - 确保每个字符串文字都包含在宏中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54867771/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com