【发布时间】:2014-06-25 06:48:54
【问题描述】:
假设你有一个 C 函数原型列表,每行一个,比如
void foo(void);
struct baz *zap(void (*callback)(void));
long long blurb(long i);
long double sinus(long double arg);
sometype_t somefunc(void);
按函数名排序结果为
long long blurb(long i);
void foo(void);
long double sinus(long double arg);
sometype_t somefunc(void);
struct baz *zap(void (*callback)(void));
据我阅读 sort(1) 手册,这不能使用 -k 选项进行排序,因为函数标识符有时是第二个单词,有时是第三个单词(让我们忽略函数标识符更远的情况对,就像拼写结构时一样)。
但我知道函数标识符是行上第一个 '(' 标记之前的字符串。有人知道对此进行排序的统一方法吗?Unixy := 单行过滤器/管道 . 我可能会破解一个丑陋的 perl 解决方案,删除无趣的左侧部分、排序和恢复左侧部分,但这远非单行。
【问题讨论】:
-
为什么要按第一个字母而不是功能对函数进行分组?
-
也许使用 awk 将函数名交换/复制到第一个位置,然后通过管道对其进行排序,这样您就可以排序 `foo: void foo(void)..."
-
当然,在 perl 中,一切都可以是一条线——只是有时它是一条非常很长的线!
-
@Lundin 因为函数已经有名称前缀,如 fooStart、fooStop、fooGet、fooSet。此外,“相同的功能”是一个相当随意和模棱两可的标准。字母顺序在插入原型的位置没有歧义。在这种顺序对编译器无关紧要的情况下,我喜欢硬性规定。
-
请注意,标准 C 函数
signal()有一个类似于void (*signal(int sig, void (*func)(int)))(int);的原型,它与您的期望不符。没有一种简单的方法可以在单行中做到这一点——这不是一个简单的问题,因为 C 语法并不简单。事实上,我认为没有一种简单的方法可以在多行脚本中执行此操作 - 仅分析行以提取函数名称是一项艰巨的工作。
标签: c sorting unix function-prototypes