c++ - 在没有正则表达式的情况下选择特定的字符串模式

标签 c++ regex c++11 macros

我有一个场景,我有各种带有特定宏的 C++ 文件:

__EXTERNALIZE(Name, File)

这个宏是空的,它什么都不做。但我想编写一个外部工具来扫描这个宏的一个或多个输入文件,并在找到后执行一些操作。

为了澄清,这里有一些伪 C:

typedef struct {
    char* varname;
    char* filename;
} MacroInfo_s;
FILE* fh = fopen("./source.cpp",'r');
while(read_untill_macro(fh) && !feof(fh)) {
    MacroInfo_s m;
    fill_macro_info(&m, fh);
    // Do something with m.varname and m.filename
}

C++11 并未广泛使用。例如,VS 2010 根本不提供它,这是我想要在 Windows 端定位的最低值。在我的 OS X 10.10 上,一切正常。这也是我主要不想使用 Regexp 的原因,因为我需要一个额外的库。仅仅对几个文件中的单个宏使用react似乎有点矫枉过正。

使这成为可能的好方法是什么?

最佳答案

我能想到的最简单的方法是使用 std::getline阅读每个开放的paren ( 然后检查你的宏的字符串。

然后是另一个std::getline阅读结束括号 ) 应该提取宏的参数。

有点像这样:

const std::string EXTERNALIZE = "__EXTERNALIZE";

int main(int, char* argv[])
{
    for(char** arg = argv + 1; *arg; ++arg)
    {
        std::cout << "Processing file: " << *arg << '\n';

        std::ifstream ifs(*arg);

        std::string text;
        while(std::getline(ifs, text, '('))
        {
            // use rfind() to check the text leading up to the open paren (
            if(text.rfind(EXTERNALIZE) != text.size() - EXTERNALIZE.size())
                continue;

            std::cout << "found macro:" << '\n';

            // now read the parameters up to the closing paren )
            std::getline(ifs, text, ')');

            // here are the macro's parameters
            std::cout << "parameters: " << text << '\n';
        }
    }
}

关于c++ - 在没有正则表达式的情况下选择特定的字符串模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30586654/

相关文章:

regex - 为什么 Perl 正则表达式不匹配 "\n"和后面的字符?

c++ - 此类声明 int(a) 的 GCC 文档

c++ - 使用 C++11 随机库在多线程中生成随机数是否像在多线程中使用 rand() 一样慢?

regex - Notepad++ 正则表达式

regex - 使用带有 sed 的正则表达式删除 html 标记

c++ - 我怎样才能找到拷贝的来源?

c++ - 如何将 boost 库添加到 Xcode 11? C++

c++ - 在 C++ 扑克中对一手牌进行排序

c++ - Boost boyer_moore 搜索语料库类型的示例类?

c++ - 当有许多项目相互依赖时,Visual C++ 中的文件夹结构