(我想这个问题可能适用于许多类型语言,但我选择使用C++作为例子.)
为什么没有办法写:
struct foo {
little int x; // little-endian
big long int y; // big-endian
short z; // native endianness
};
Run Code Online (Sandbox Code Playgroud)
指定特定成员,变量和参数的字节顺序?
我知道变量的类型不仅决定了用于存储值的字节数,还决定了在执行计算时如何解释这些字节.
例如,这两个声明每个都分配一个字节,对于两个字节,每个可能的8位序列都是有效值:
signed char s;
unsigned char u;
Run Code Online (Sandbox Code Playgroud)
但是相同的二进制序列可能会有不同的解释,例如11111111,在分配时指的是-1,而指定时指的是s255 u.当有符号和无符号变量涉及相同的计算时,编译器(主要)负责正确的转换.
在我的理解中,字节序只是同一原则的变体:基于关于存储它的存储器的编译时信息对二进制模式的不同解释.
在允许低级编程的类型语言中使用该功能似乎是显而易见的.但是,这不是C,C++或我所知的任何其他语言的一部分,我没有在网上找到任何关于此的讨论.
我会试着总结一下我在询问后的第一个小时内收到的许多评论中的一些内容:
此外,现在我意识到签名和字节序不是一个完美的类比,因为:
big int并little int会具有完全相同的数值范围.unsigned char(假设char有8位)130不能用a表示signed …在发布这个问题并阅读那个问题后,我意识到知道一个方法是否应该返回null是非常重要的,或者如果这被认为是错误条件并且应该抛出异常.还有一个很好的讨论,何时返回'null'或抛出异常.
我正在写一个方法,我已经知道如果我想返回null或抛出异常,表达我的决定的最佳方式是什么,换句话说,记录我的合同?
我能想到的一些方法:
我主要讨论java,但它也可能适用于其他语言:为什么有一种正式的方式来表达是否会抛出异常(throws关键字)但是没有正式的方式来表达是否可能返回null?
为什么没有这样的东西:
public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
return null; // this would lead to a compiler error!
}
Run Code Online (Sandbox Code Playgroud)
表达合同的方式有很多种:
我打算编写一个应该可以被广泛的平台上的大量人使用的库.我需要考虑什么来设计它?为了使这个问题更具体,最后有四个"子问题".
考虑到所有已知的要求和细节,我得出结论,用C或C++编写的库是可行的方法.我认为我的库的主要用途是在用C,C++和Java SE编写的程序中,但我也可以考虑从Java ME,PHP,.NET,Objective C,Python,Ruby,bash scrips中使用它的原因,等等......也许我无法针对所有这些,但如果有可能,我会做到的.
在这里描述我的库的全部目的将是很多,但有些方面可能对这个问题很重要:
当然,无论答案是满足我的具体要求,还是以一般方式回答问题,对更广泛的受众都有帮助,我们都欢迎回答!
以下是我在过去几个月收集的一些假设和结论:
我一直在使用eclipse和SVN多年从一个开发人员到12人的团队,我总是设置我们的文件夹结构.我设法让它以某种方式工作,但我觉得我的文件夹布局远非最佳.我很难说出我的典型文件夹布局是什么样的,因为每次看起来都非常不同.
我现在正在开始另一个大项目,我想这次以专业的方式做.
这些都是现在的事实:
我总是不确定是否提交了由eclipse生成的文件(比如'.project''和''.classpath'').在之前的项目中,有时我们将它们放入SVN,有时我们没有,这两种方法都有其优点和缺点.有一次,我们甚至承诺了整个工作空间,但这似乎是一个坏主意.
我当然缺少的一个关键概念是Eclipse如何处理其工作空间.默认情况下,整个项目位于工作空间文件夹中,但可能存在外部项目,这些项目以某种神奇的方式链接,我只是不明白.
我不确定如何在本地和存储库中布局项目.我认为有三种可能性:
一个虚拟的文件夹结构,可能是这样的(我只回答我自己的问题吗?):
随着提示要检查哪里,像这样:
还有一些指导者喜欢
如果我在这样的调用中得到NullPointerException:
someObject.getSomething().getSomethingElse().
getAnotherThing().getYetAnotherObject().getValue();
Run Code Online (Sandbox Code Playgroud)
我得到一个相当无用的异常文本,如:
Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)
Run Code Online (Sandbox Code Playgroud)
我发现很难找到实际上调用returend null,经常发现自己将代码重构为这样的东西:
Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();
Run Code Online (Sandbox Code Playgroud)
然后等待更具描述性的NullPointerException,告诉我要查找哪一行.
你们中的一些人可能认为连接getter是一种糟糕的风格,无论如何都应该避免,但我的问题是:我可以在不更改代码的情况下找到错误吗?
提示:我正在使用eclipse,我知道调试器是什么,但我无法弄清楚如何将它应用于问题.
我对答案的结论是:
有些答案告诉我,我不应该一个接一个地连接吸气剂,一些答案显示我如何调试我的代码,如果我不赞成这个建议.
我已经接受了一个答案,这个答案让我知道什么时候连接吸气剂:
这使得对实际调试的任何好建议毫无用处.
我对可移植性的不同方面感兴趣(正如你在浏览我的其他问题时所看到的那样),所以我读了很多关于它的内容.很多时候,我读/听说Code应该以一种可以在不同的编译器上编译的方式编写.
没有任何gcc/g ++的真实生活经验,在我看来它支持人们可以想象的每个主要平台,因此编译g ++的代码几乎可以在任何系统上运行.那么为什么有人会费心在MS编译器,英特尔编译器和其他人上运行他的代码呢?
我也可以想到一些原因.正如常见问题解答建议的那样,我会尝试将它们作为答案发布,反对将它们纳入我自己的问题中.
你们让我完全相信有几个很好的理由来支持多个编译器.原因很多,很难选择一个被接受的答案.对我来说最重要的原因:
另一方面,我仍然认为还有其他更重要的事情,现在我知道有时它根本不重要.
最后,没有一个单一的答案可以说服我不要选择GCC作为我项目的主要或默认编译器.
当我编译这样的东西时:
public class MyClass
{
void myMethod(String name, String options, String query, String comment)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
并将其编译为类文件,似乎参数名称丢失了.也就是说,当其他一些Java代码引用MyClass并想要调用或覆盖时myMethod,我的IDE(当前是Eclipse)似乎从类文件中获取此方法签名:
void myMethod(String arg0, String arg1, String arg2, String arg3);
Run Code Online (Sandbox Code Playgroud)
我知道,Eclipse(可能还有其他的IDE太)让我提供一个链接到源或javadoc的(如Bishiboosh指出的)的MyClass,可以充分利用这一点.但我很好奇是否有某种方法可以告诉javac我们将名称包含在类文件中,以便该类的用户可以看到参数名称,即使它们只有类文件.
当我用类编译一个类时java -g:vars,参数的名称包含在类文件中.-g:vars似乎等同于Eclipse - >项目属性 - > Java编译器 - >将变量属性添加到生成的类文件中.
几位作者提出了这个解决方案,但尼克的回答终于让我相信了.
在我的机器上,Eclipse有时会使用这些信息,有时它没有,这可能是我的错或Eclipse中的错误,但不是类文件或编译的问题.无论如何,现在我知道信息肯定存在.
虽然这对于类来说很好(有点),但它不适用于接口.
对我来说,逻辑上的原因似乎是,-g:vars只提供局部变量的名称,这也是javac的文档所述.在方法体中,它的参数与局部变量非常相似,因此它们被-g:vars覆盖.接口方法没有实体,因此它们不能有局部变量.
我最初的问题只是要求上课,因为我不知道可能有任何不同.
正如gid所指出的,类文件格式不支持参数名称的存储.我在类文件规范中找到了一个描述数据结构的部分,该数据结构应该是方法的参数名称,但在编译接口时绝对不会使用它.
在编译类时,我无法判断是否使用了所提到的数据结构,或者Eclipse是否根据方法体内参数的使用推断出参数名称.专家可以澄清这一点,但我认为这并不相关.
我正在尝试编写一个运行不同java平台的应用程序,如J2SE,J2ME,Android等.我已经知道我必须为每个平台重写大部分UI,但是想重用核心逻辑.
保持这个核心便携性涉及三个我所知道的缺点:
我知道如何克服(1):5.0风格的代码并自动将其转换为1.4(retroweaver - 尚未尝试过,但似乎没问题).
我认为(2)是一个我必须接受的问题.
现在我想知道(3)最好的工作环节是什么,特别是我最想念的收藏课程.我能想到这些:
Set,Map,List等,并退回到Vector朴素阵列.我认为这首先使代码变得丑陋.但我也知道正确的选择之间TreeSet/Hashset或LinkedList/ArrayList对性能至关重要,而且总是使用Vector和Arrays也不对.感谢您的回答和意见!
编辑:我终于找到了一个(复杂但很好)的解决方案,我想通过提供我自己的答案并接受它,解决方案将在顶部可见.但恰恰相反,我的答案仍处于最底层.
在C++中,我正在使用boost::shared_ptr并boost::weak_ptr自动删除不再需要的对象.我知道这些工作与引用计数.
在Java中,内存是由垃圾收集器,其consideres管理的内置对象引用为强,WeakReference因为弱和SoftReference在之间(可通过GC收集,但可能还有生存的GC)的东西,这是非常方便的用于缓存对象一段时间,但一旦可用内存不足就将它们丢弃.
所以现在我回到了C++中,我错过了软引用的安慰.我想知道软引用是否适用于引用计数.当清除对象的最后一个强引用,并且仍然有一个软引用时,它什么时候会被删除?我可以想到一些方案,但对我来说似乎都不聪明.
为了防止软引用和引用计数有适当的语义,我想知道这是否已经实现,可能是以一种甚至兼容的方式boost::shared_ptr(或C++ TR1等效std::shared_ptr的方式).
如果两个问题的答案都是否定的,那么对象缓存场景中的替代方案是什么?
编辑: 当然我说的是缓存实际上很有用的情况,因为构造对象的成本很高(想想几次访问数据库和网络查询),但是有太多东西要永远保存它们.
我正在考虑在移动设备上的应用程序中使用RDF和OWL等语义(Web)技术.目前我的目标是android,但我也对iPhone和J2ME的可能性感兴趣.
我想使用库而不是从头开始实现所有内容.
我知道有一些像Jena,Redland,Protégé这样的库/框架,但他们没有说明他们知道哪些平台可以工作.
拥有动态对象模型并从XML解析到XML是我必须拥有的.
我也想使用推理,但我被告知它是计算密集型的,所以这只是一个很好的选择.
对于所提到的所有平台,问题可以解释为
some.JS.Code;
//ignore this line from linting etc.
##Software will do some stuff here, but for JS it's an Error##
hereGoesJs();
Run Code Online (Sandbox Code Playgroud)
是否有可能从 Visual Studio Code 中的 linting 和格式化中排除一行?因为我需要该行,但还需要代码其他部分的 Linting 和格式化...
// I Tried
// eslint-disable-next-line no-use-before-define
// eslint-disable-line no-use-before-define
/*eslint-disable */
//suppress all warnings between comments
alert('foo');
/*eslint-enable */
// @ts-ignore
Run Code Online (Sandbox Code Playgroud) 我非常喜欢仿制药,并尽可能地使用它们.我偶尔需要在另一个项目中使用我的一个类,它必须在旧的JVM上运行(5.0之前),需要在JavaME上运行(不允许使用泛型)或者在Microsoft J#中运行(其中非常差)支持泛型).
目前,我手动删除所有泛型,这意味着也插入了许多强制转换.
由于泛型被认为只是编译时,并且每一段通用代码都可能自动转换为非泛型代码,我想知道是否有任何工具可以为我做这件事.
如果没有这样的工具,我怎么能解决这个问题呢?我应该完全停止使用泛型吗?
已经有与字节码兼容性相关的答案.如果由于某种原因我需要源代码兼容性怎么办?
我正在尝试java.util.TreeMap在J2ME应用程序中使用.我知道它TreeMap存在于J2SE上但不存在于J2ME上,所以我已经做了一些努力将J2SE 6.0移植TreeMap到J2ME 1.2并将其包含在我的Midlet Jar中.这涉及移植一半的集合框架,但现在我(理论上)完成了它并想要测试它.
但是当我在SUN J2ME SDK 3.0模拟器(DefauldClclPhone2)上启动我的应用程序时,我得到以下异常:
java.lang.NoClassDefFoundError: java/util/TreeMap
java.lang.Class.invoke_verify(), bci=0
java.lang.Class.initialize(), bci=117
com.companyname.test.TestMidlet.<init>(), bci=19
java.lang.Class.newInstance(), bci=0
com.sun.midp.main.CldcMIDletLoader.newInstance(), bci=46
com.sun.midp.midlet.MIDletStateHandler.createMIDlet(), bci=66
com.sun.midp.midlet.MIDletStateHandler.createAndRegisterMIDlet(), bci=17
com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=27
com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26
Run Code Online (Sandbox Code Playgroud)
在我得到的真实设备上"Error in Application"但看不到实际的异常,因为我现在没有匹配的SDK.
我的应用程序成功地经历了预验证过程,我感到很困惑.我总是经历过一个缺失的课程(前几天我有很多课程)在预验证器中触发错误.所以我得出结论,在成功预先验证之后NoClassDefFoundError,设备上就没有任何东西了.
我的jar里面的目录结构如下:
test.jar
com
companyname
(my application classes, including the Midlet class)
java
lang
Comarable.class
Iterable.class
(some others which are missing on J2ME)
util
TreeMap.class
TreeSet.class
(many others which …Run Code Online (Sandbox Code Playgroud) java ×6
c++ ×4
portability ×4
java-me ×3
c ×2
eclipse ×2
midp ×2
android ×1
boost ×1
cldc ×1
compilation ×1
debugging ×1
endianness ×1
gcc ×1
generics ×1
getter ×1
iphone ×1
javac ×1
javascript ×1
jvm ×1
null ×1
owl ×1
rdf ×1
shared-ptr ×1
svn ×1
treemap ×1
typescript ×1