在C中,NULL等同于0,所以我应该将这两个值都视为nil吗?

据我所知,NULL可以(或者至少在我的stdlib实现中)被定义为:

#define NULL ((void*)0)

同时,https://stackoverflow.com/a/924683/668125指出,在C++中,NULL会自动转换为/来自((int)0)(这就是为什么在C++中应该使用std::nullptr,因为它有一个真正的nil类型/值对,感谢nullptr_t不透明的typedef)。

因此,我目前正在开发一个LuaJIT库,想提供一个帮助函数来检查一个值是否为nil/ NULL / 或其他任何东西(即一个代表nil但可能不是nil类型的值)。

目前如下所示:

function ffi.nil(value)
  return value==nil or value==ffi.NULL
end

但是,在C中的(NULL==0)将为True,如下面这个在我的系统上打印出true的片段所验证的那样:

#include <stdio.h>
#include <stdlib.h>
void main(void){
  if(NULL==0)
    printf("true\n");
  else
    printf("false\n");
}

那么我应该采用下面这个定义的“表示NIL”的值呢?

function ffi.nil(value)
  return value==nil or value==ffi.NULL or value==0
end

TL;DR:在C中,NULL等于0,而在LuaJIT的FFI中,没有两个nil,ffi.NULL,0对是相等的;因此,在定义在处理第三方C库时应该将哪个值视为“nil-like”值时,我应该包括0还是只包括nil或ffi.NULL

免责声明:我担心这可能会被视为“基于个人看法的问题”,因此,在这种情况下,我将更改问题:忽略其是否被认为是良好或不良好的风格,哪种行为更有可能产生正确的结果(因此,如果这种风格很糟糕,但是这个特定的风格缺陷在>50%的常见库之间是一致的,那么我将不得不这样做)?

点赞
用户646619
用户646619

如果value为一个空的cdata对象,value == nil返回true

LuaJIT 2.1.0-alpha - 版权所有(C)2005-2014 Mike Pall。http://luajit.org/
JIT:ON SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse
> ffi = require "ffi"
> print(ffi.new("void*", nil) == nil)
true

因此,你的ffi.nil函数没有意义。只需使用if value == nil就可以了。

注意:

  1. if value then不能工作,因为value是一个cdata对象,因此即使它等于nil也会被评估为true。这有点令人困惑,但这就是实际情况。

  2. 替换内置函数和修改内置库表通常是不好的编程实践。你应该定义一个本地函数或一个库函数。

2014-07-20 14:33:10