clang中的Pragma处理是建立在clang::PragmaHandler[1]类上。先给一段小代码:
Preprocessor PP;
clang::PragmaNamespace* omp= new clang::PragmaNamespace("omp");
PP.AddPragmaHandler(omp);
omp->AddPragma(new PragmaHandler(PP.getIdentifierInfo("for")));
这段代码是识别出OpenMP的“#pragma omp for”指导语句。首先得创建新的命名空间omp(line 2),然后把这命名空间添加进去Preprocessor中(line 3),最后再把omp其中一个的标识符for加进去(line 4)。
程序运行过程中Preprocessor在跑的时候会自动识别出“#pragma omp for”,另外PragmaHandler类中有一个虚函数HandlePragma,此函数的功能是每次识别出一个符合条件的指导语句时会被调用一次,因为程序员可以重写这个函数来收集每个指导语句的相关信息。
参考:
[1] http://clang.llvm.org/doxygen/classclang_1_1PragmaHandler.html