我正在寻找从代码中删除C和C++注释的Python代码.(假设字符串包含整个C源文件.)
我意识到我可以使用正则表达式匹配.match()子串,但这不能解决嵌套问题/*,或者//内部问题/* */.
理想情况下,我更喜欢一个能够正确处理尴尬案例的非天真实现.
如果它们以/*开头并以*结尾,我如何删除所有注释?我尝试了以下操作.它适用于一行评论.
sed '/\/\*/d'
Run Code Online (Sandbox Code Playgroud)
但它不会删除多行注释.例如,不删除第二行和第三行.
/*!50500 PARTITION BY RANGE (TO_SECONDS(date_time ))
PARTITION 20120102parti VALUES LESS THAN (63492681600),
(PARTITION 20120101parti VALUES LESS THAN (63492595200) */ ;
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我需要保留最后一个; 在结束评论标志后.
我正在从K&R书中学习C,在第一章中学习练习1.23,我必须编写一个程序,删除用户输入的一些C代码的所有注释.到目前为止,这是我完成的程序.我能做些什么改进吗?
/**
Tuesday, 10/07/2013
Exercise 1.23
Write a program to remove all comments from a C
program. Don't forget to handle quoted strings
and character constants properly. C comments
don't nest.
**/
#include <stdio.h>
#define MAX_LENGTH 65536
#define NOT_IN_COMMENT 0
#define SINGLE_COMMENT 1
#define MULTI_COMMENT 2
main()
{
char code[MAX_LENGTH]; /* Buffer that stores the inputted code */
int size = 0; /* Length of the inputted code */
int loop; /* Integer used for the for loop */
char …Run Code Online (Sandbox Code Playgroud) 我想删除toy.c文件中的所有评论。从从 C/C++ 代码中删除注释我看到我可以使用
gcc -E -fpreprocessed -P -dD toy.c
Run Code Online (Sandbox Code Playgroud)
但是我的一些代码(比如我不想编译的弃用函数)被包裹在#if 0和之间endif,就好像它们被注释掉了一样。
-fpreprocessed防止;-fpreprocessed是一个坏主意。我在这里看到了一个困境。有没有办法摆脱这种情况?谢谢。
以下玩具示例“toy.c”足以说明问题。
#define foo 3 /* this is a macro */
// a toy function
int main (void) {
return foo;
}
// this is deprecated
#if 0
int main (void) {
printf("%d\n", foo);
return 0;
}
#endif
Run Code Online (Sandbox Code Playgroud)
gcc -E -fpreprocessed -P -dD toy.c 给
#define foo 3
int main (void) {
return …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来搜索项目的C/C++代码中的给定术语,同时忽略注释和字符串中的任何出现.
由于代码库相当大,我正在寻找一种方法来自动识别与我的搜索词匹配的代码行,因为它们需要手动检查.
如果可能的话,我想在我的linux系统上执行搜索.
所讨论的代码库是一个带有大量第三方插件的实时信号处理引擎.插件是用各种语言实现的(大多数是C语言,但也有C++和其他语言;目前我只关心这两种语言),没有强制执行任何标准.
我们的代码库目前使用内置类型float的浮点数,我们想用一个typedef允许我们使用双精度的代码.我们希望float在实际代码中找到所有出现的内容(忽略评论和打印输出中的合法用法).
更进一步的是,在代码有效负载中有一些(虽然很少)合法使用float(因此我们真的在寻找一种方法来识别所有需要手动检查的地方,而不是运行一些自动搜索和替换. )
代码还包含C样式的静态强制转换(float),因此依靠编译器警告来识别类型不匹配通常不是一种选择.
代码库由超过3000个(C和C++)文件组成,累积约750000行代码.
代码是跨平台的(linux,osx,w32是主要目标;但也是freebsd和类似的),并使用各种本机编译器(gcc/g ++,clang/clang ++,VisualStudio,...)进行编译.
到目前为止,我正在使用丑陋的东西:
grep "\bfloat\b" | sed -e 's|//.*||' -e 's|"[^"]*"||g' | grep "\bfloat\b"
Run Code Online (Sandbox Code Playgroud)
但我认为必须有一些更好的方法来搜索有效载荷代码.