c++ - CMake 正则表达式匹配包含声明中的 header 名称

标签 c++ regex cmake

我试图在我的 robot.cpp 中获取所有 #include 声明的 header 名称,即,如果我有一个包含两个声明的 example.cpp:

example.cpp

#include "MyLib.h"
#include <iosream>

//some code

我想在我的输出中看到这样的东西:

INCLUDE_NAME MyLib.h
INCLUDE_NAME iosream

我有这些robot.cppCMakeLists.txt文件(已简化):

CMakeLists.txt

...
   file(STRINGS ${SRC_FILE} SRC_CONTENT) #copy the file content

   foreach(SRC_LINE ${SRC_CONTENT})
     if("${SRC_LINE }" MATCHES "^ *#include *[<\"](.*)[>\"]")
        message("INCLUDE_NAME ${CMAKE_MATCH_1}")
...

机器人.cpp

#include "ArduinoRobot.h"
#include "EasyTransfer2.h"

void RobotControl::pointTo(int angle){
    int target=angle;
    uint8_t speed=80;
    target=target%360;
    if(target<0){
        target+=360;
    }
    int direction=angle;
    while(1){
        if(direction>0){
            motorsWrite(speed,-speed);//right
            delay(10);
        }else{
            motorsWrite(-speed,speed);//left
            delay(10);
        }
        int currentAngle=compassRead();
        int diff=target-currentAngle;
        if(diff<-180) 
            diff += 360;
        else if(diff> 180) 
            diff -= 360;
        direction=-diff;

        if(abs(diff)<5){
            motorsWrite(0,0);
            return;
        }
    }
}

然后,如果我在控制台中执行我的 CMakeList.txt,我会得到以下输出:

...
    INCLUDE_NAME ArduinoRobot.h"#include "EasyTransfer2.h"void RobotControl::pointTo(int angle){     int target=angle;       uint8_t speed=80;       target=target%360;      if(target<0){           target+=360; }       int direction=angle;    while(1){               if(direction>0){                        motorsWrite(speed,-speed);//right                       delay(10);              }else{                  motorsWrite(-speed,speed);//left                     delay(10);              }               int currentAngle=compassRead();         int diff=target-currentAngle;           if(diff<-180)                   diff += 360;            else if(diff    
...

但是,如果我更改所有符号 >< ,结果没问题,我得到以下输出:

...
INCLUDE_NAME ArduinoRobot.h
INCLUDE_NAME EasyTransfer2.h
...

我猜是因为正则表达式,但我不知道如何解决它。

有人吗?

最佳答案

我认为有两个问题。我强烈怀疑,第一个是源代码中的行尾。您的代码本来可以像最初那样工作,只是您正在解析的代码可能是从某个地方下载的,并且该文件可能具有不同的行尾。例如,如果原始版本是在 Linux 下开发的,而您在 Windows 下运行,则可能会发生这种情况。这需要先解决。

其次,您真正想要的是一个正则表达式,它不接受中间的任何字符,而只接受不匹配 "> 的字符。这是我刚才测试的内容:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(NONSENSE NONE)
file(STRINGS "silly.txt" SRC_CONTENT)
foreach(SRC_LINE ${SRC_CONTENT})
    if("${SRC_LINE}" MATCHES "^[ \t]*#[ \t]*include[ \t]*[<\"]([^>\"]*)[>\"]")
        message("INCLUDE_NAME ${CMAKE_MATCH_1}")
    endif()
ENDFOREACH()

silly.txt的内容:

#  include "foo.h"
#include    "bar.h"

#include "ArduinoRobot.h"#include "EasyTransfer2.h"int main()
{
    printf("This is not a header.\n");
    return 0;
}

    #include "surprise.h"

请注意,bar.h 行的中间和 surprise.h 行的开头有一个制表符。奇怪但仍然被预处理器接受的还有 foo.h 行中显示的变体,其中 # 和指令之间有空格或制表符。显示的正则表达式处理所有这些。

这是那个的输出:

INCLUDE_NAME foo
INCLUDE_NAME bar
INCLUDE_NAME foo.h
INCLUDE_NAME bar.h
INCLUDE_NAME ArduinoRobot.h
INCLUDE_NAME surprise.h

关于c++ - CMake 正则表达式匹配包含声明中的 header 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915902/

相关文章:

c++ - Visual Studio Express 显示错误 : "internal error occured in compiler"

c++ - 如何指示 CMake 仅使用特定目录中的库

c++ - 有没有办法避免隐式转换为 void*?

c++ - 错误 C2664 : 'errno_t wcstombs_s(size_t *,char *,size_t,const wchar_t *,size_t)' : cannot convert parameter 4

javascript - 格式化电话号码

java - 查找符合特定格式的所有子字符串

c++ - 是否有与 BUCK 的 header_namespace 等效的 cmake?

c++ - 递归循环遍历目录并收集所有xml文件

c++ - 重载预增量运算符时是否必须返回对对象的引用?

javascript - 匹配任何不以零结尾的数字的正则表达式