我有一组相关的C++类,必须以这样的方式包装和导出DLL,以便C/FFI库可以轻松使用它们.我正在寻找一些"最佳实践"来做这件事.例如,如何创建和释放对象,如何处理基类,替代解决方案等...
到目前为止,我的一些基本指导原则是将方法转换为简单函数,并使用额外的void*参数表示'this'指针,包括任何析构函数.构造函数可以保留其原始参数列表,但必须返回表示该对象的指针.所有内存都应该通过同一组进程范围的分配和自由例程来处理,并且在某种意义上应该可以通过宏或其他方式进行热交换.
只花了几个小时调试这段代码:
LinkedHashMap<String, Integer> rsrqs = new LinkedHashMap<String, Integer>();
Integer boxedPci = 52;
Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : -1;
Run Code Online (Sandbox Code Playgroud)
以上产生了NullPointerException.以下代码不:
LinkedHashMap<String, Integer> rsrqs = new LinkedHashMap<String, Integer>();
Integer boxedPci = 52;
Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : Integer.valueOf(-1);
Run Code Online (Sandbox Code Playgroud)
唯一的区别是用Integer.valueOf()包装-1.一旦有人解释了为什么这个代码的行为方式,我肯定我会打破我的前额..但有人可以向我解释为什么这个代码的行为方式:)
- 编辑
第二个想法,我怀疑NPE来自rsrqs.get()返回null,我认为java在尝试解包成int之前,然后再回到整数.Integer.valueOf()强制Java执行unbox-box步骤.故事的道德启示; 不要只忽略Eclipse中的那些拳击警告;)
我需要获取给定块所需的参数数量.例如:
foobar(1,2,3) { |a, b, c|
}
def foobar(x, y, z, &block)
# need to obtain number of arguments in block
# which would be 3 in this example
end
Run Code Online (Sandbox Code Playgroud)
这可以在1.9主干中使用,但不能在任何正式版本中使用.我希望有没有办法做到这一点,而无需下载单独的gem /扩展模块.
我一直在为我们内部使用的语言开发一个基于Xtext的Eclipse插件.该语言可能包含以下形式的声明:
run : /some/file/path/foo.txt
Run Code Online (Sandbox Code Playgroud)
...最终我想提供一个自定义的位置提供程序,以便在文件路径上按F3将在Eclipse的新编辑器中打开该文件.我还没有机会尝试这个,但有没有人看到以下方法有什么问题?
任何建议表示赞赏,谢谢