我试图在我的 robot.cpp 中获取所有 #include 声明的 header 名称,即,如果我有一个包含两个声明的 example.cpp:
example.cpp
#include "MyLib.h"
#include <iosream>
//some code
我想在我的输出中看到这样的东西:
INCLUDE_NAME MyLib.h
INCLUDE_NAME iosream
我有这些robot.cpp
和 CMakeLists.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/