小编cor*_*ump的帖子

使用GCC和clang __attribute __((cleanup))和指针声明的一种好的惯用方法

我认为GCC扩展__attribute__((cleanup))是一个好主意,至少在某些情况下,但我无法弄清楚如何以一种好的方式使用它.我所做的一切看起来仍然很烦人.

我看到了很多的代码做#define _cleanup_(x) __attribute__((cleanup(x))只是为了少打字,但它有没有办法通过有没有一个标准功能一样free或者closedir,fclose等?

我看到我不能写:

__attribute__((cleanup(free))) char *foo = malloc(10);
Run Code Online (Sandbox Code Playgroud)

因为清理回调会收到char**指针,所以我必须总是这样写:

static void free_char(char **ptr) { free(*ptr); }
__cleanup__((free_char)) char *foo = malloc(10);
Run Code Online (Sandbox Code Playgroud)

这非常烦人,最烦人的部分是为你需要的所有类型定义这样的清理函数,因为显然你不能只为它定义它void **.避免这些事情的最佳方法是什么?

c gcc clang

18
推荐指数
2
解决办法
3518
查看次数

为什么要定义函数原型,然后使用相同名称的预处理器宏?

我正在读一本关于C的书,在作者代码的某处我发现了一个函数原型的定义,然后是一个具有相同名称的宏,并且在任何.h.c文件中都没有函数本身的定义.

我的意思是这样的:

int print_my_stufff(char *stuff);
#define print_my_stuff(A) (printf("%s\n", A))
/* and print-my-stuff() function never defined anywhere else */
Run Code Online (Sandbox Code Playgroud)

代码有效,但我不知道为什么他首先需要一个函数原型?难道他不能写一个宏吗?重点是什么?是告诉编译器应该将宏评估为返回的表达式int还是什么?删除原型似乎不会改变行为.作者没有解释这一点.

c c-preprocessor

15
推荐指数
1
解决办法
924
查看次数

在destructuring-bind中声明未使用的变量的任何好方法?

我无法想象,有没有办法在erlang中输入_之类的东西,在destructuring-bind中使用"未使用的值"?

例如,我们有类似的东西:

(destructuring-bind ((_SNIPPET
                               (_TITLE . title)
                               (_DESCRIPTION . description)
                               _RESOURCE-ID (_VIDEO-ID . video-id)))) entry
                (declare (ignore 
                          _SNIPPET _TITLE _DESCRIPTION _RESOURCE-ID _VIDEO-ID))
                (list video-id title description)))
Run Code Online (Sandbox Code Playgroud)

如果不为每个未使用的值放置特定变量,那就太棒了,写下这样的东西:

 (destructuring-bind ((_
                         (_ . title)
                         (_ . description)
                         (_ (_ . video-id)))) entry
                    (list video-id title description)))
Run Code Online (Sandbox Code Playgroud)

有没有办法通过标准解构 - 绑定或任何其他标准宏来获得这种行为?或者我必须使用一些类似ML的模式匹配库,如果是这样 - 哪一个?

lisp common-lisp pattern-matching destructuring

8
推荐指数
2
解决办法
1433
查看次数

Common Lisp中的列表对象方法(CLOS)

有没有办法让对象定义所有方法并检查对象是否响应指定的方法?

寻找类似Ruby的"foo".方法

(list-methods *myobj*) ;; -> (method0 method1 methodN)
Run Code Online (Sandbox Code Playgroud)

还有像ruby的"foo".respond_to?:方法

(has-method-p *myobj* 'foo-method) ;; -> T
Run Code Online (Sandbox Code Playgroud)

对于插槽,有slot-exists-p什么方法?

谢谢.

lisp oop common-lisp clos

4
推荐指数
2
解决办法
995
查看次数

cl-ppcre:替换正则表达式替换和反斜杠

可能这个问题真的很糟糕,但我被困住了.如何cl-ppcre:regex-replace-all更换反斜杠?

例如,我只想逃避一些字符,比如'"()等,所以我首先要用|替换,看看匹配是否正常:

    CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "|\\1"))
    PRINTED: foo |"bar|" |'baz|' |(test|)
Run Code Online (Sandbox Code Playgroud)

好的,我们把斜线:

    CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\1"))
    PRINTED: foo "bar" 'baz' (test) ;; No luck
Run Code Online (Sandbox Code Playgroud)

不,我们有两个斜线:

    CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\\1"))
    PRINTED: foo \1bar\1 \1baz\1 \1test\1 ;; Got slash, but not \1
Run Code Online (Sandbox Code Playgroud)

也许是这样的?

(princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\{1}"))
PRINTED: foo "bar" 'baz' (test) ;; Nope, no luck here
Run Code Online (Sandbox Code Playgroud)

当然,如果我在斜线之间放置空间就可以了,但我不需要它

(princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])" …
Run Code Online (Sandbox Code Playgroud)

lisp regex common-lisp cl-ppcre

3
推荐指数
1
解决办法
273
查看次数

基于if next行的不同命令是否为空

我正在尝试自动添加; 或者通过击键在表达结束时需要的任何内容,并转到另一行.

基本上它会是这样的inoremap <leader>; <C-o>A;,但我想要一点改进.如果下一行是空的(或不存在)我希望它做<C-o>A;<cr>,如果它不是空的<C-o>A;<Down>.换句话说,我需要一种惯用的方法来检查下一行是否存在以及它是否为空.谢谢.

vim viml

2
推荐指数
1
解决办法
204
查看次数

用于funcall的语法糖?

为什么funcall没有语法糖?我们需要它很多.写一些像是为什么不添加类似Ruby的&:方法表示法的东西(&#do-something arg0 arg1 arg2)不是很好(funcall do-something arg0 arg1 arg2)吗?语言中是否有某些内容?

lisp functional-programming common-lisp

1
推荐指数
2
解决办法
373
查看次数