小编Len*_*mel的帖子

为什么在C++中没有像签名那样的字节顺序修饰符?

(我想这个问题可能适用于许多类型语言,但我选择使用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++或我所知的任何其他语言的一部分,我没有在网上找到任何关于此的讨论.

更新

我会试着总结一下我在询问后的第一个小时内收到的许多评论中的一些内容:

  1. signness是严格二进制的(无论是有符号还是无符号),并且总是与endianness相反,endianness也有两个众所周知的变体(大和小),但也有较少知名的变体,如mixed/middle endian.未来可能会发明新的变种.
  2. 字节顺序访问多字节值时,字节顺序很重要.除了字节序之外还有很多方面会影响多字节结构的内存布局,所以这种访问通常是不受欢迎的.
  3. C++旨在针对抽象机器并最小化有关实现的假设数量.这个抽象机器没有任何字节序.

此外,现在我意识到签名和字节序不是一个完美的类比,因为:

  • endianness仅定义某些事物如何表示为二进制序列,但现在可以表示什么.双方big intlittle int会具有完全相同的数值范围.
  • 有符号性定义比特和实际值如何相互映射,但也影响可以表示的内容,例如-3不能用a表示unsigned char(假设char有8位)130不能用a表示signed …

c++ language-features static-typing endianness

58
推荐指数
2
解决办法
6113
查看次数

如何显示方法是否可以返回null

在发布这个问题并阅读那个问题,我意识到知道一个方法是否应该返回null是非常重要的,或者如果这被认为是错误条件并且应该抛出异常.还有一个很好的讨论,何时返回'null'或抛出异常.

我正在写一个方法,我已经知道如果我想返回null或抛出异常,表达我的决定的最佳方式是什么,换句话说,记录我的合同?

我能想到的一些方法:

  • 在规格/文档中写下来(任何人都会阅读它吗?)
  • 使它成为方法名称的一部分(正如我在这里建议的那样)
  • 假设抛出异常的每个方法都不会返回null,并且每个执行'not'抛出的方法都可能返回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)

总结和结论

表达合同的方式有很多种:

  • 如果您的IDE支持它(作为IntelliJ),最好使用注释,@NotNull因为它对程序员可见,并且可用于自动编译时检查.Eclipse有一个插件可以添加对这些的支持,但它对我不起作用.
  • 如果这些不是一个选项,请使用类似Option<T>或的自定义类型NotNull<T>,这样可以增加清晰度并至少提高运行时检查.
  • 无论如何,在JavaDoc中记录合同永远不会伤害,有时甚至会有所帮助.
  • 除了我之外,没有人提出使用方法名来记录返回值的可空性,虽然它可能非常详细而且并不总是有用,但我仍然认为它有时也有其优点.

java null design-by-contract

45
推荐指数
2
解决办法
3万
查看次数

如何设计一个可以在许多客户端语言中使用的C/C++库?

我打算编写一个应该可以被广泛的平台上的大量人使用的库.我需要考虑什么来设计它?为了使这个问题更具体,最后有四个"子问题".

选择语言

考虑到所有已知的要求和细节,我得出结论,用C或C++编写的库是可行的方法.我认为我的库的主要用途是在用C,C++和Java SE编写的程序中,但我也可以考虑从Java ME,PHP,.NET,Objective C,Python,Ruby,bash scrips中使用它的原因,等等......也许我无法针对所有这些,但如果有可能,我会做到的.

要求

在这里描述我的库的全部目的将是很多,但有些方面可能对这个问题很重要:

  • 图书馆本身起初很小,但肯定会变得非常复杂,因此不能同时维护多个版本.
  • 但是,大多数复杂性将隐藏在库中
  • 该库将构建一个在内部大量使用的对象图.库的某些客户端只对特定对象的特定属性感兴趣,而其他客户端必须以某种方式遍历对象图
  • 客户端可以更改对象,并且必须通知库
  • 库可以更改对象,并且如果客户端已经具有该对象的句柄,则必须通知客户端
  • 该库必须是多线程的,因为它将维护与其他几个主机的网络连接
  • 虽然一些请求到图书馆可以同步处理,其中许多人将采取太长,必须在后台进行处理,并通知客户端上的成功(或失败)

当然,无论答案是满足我的具体要求,还是以一般方式回答问题,对更广泛的受众都有帮助,我们都欢迎回答!

我的假设,到目前为止

以下是我在过去几个月收集的一些假设和结论:

  • 在内部我可以使用我想要的任何东西,例如C++与运算符重载,多重继承,模板元编程......只要有一个可移植的编译器来处理它(想想gcc/g ++)
  • 但我的界面必须是一个干净的C接口,不涉及名称修改
  • 另外,我认为我的界面应该只包含函数,基本/原始数据类型(也许是指针)作为参数传递并返回值
  • 如果我使用指针,我想我应该只使用它们将它们传递回库,而不是直接在引用的内存上操作
  • 对于在C++应用程序中的使用,我可能还提供面向对象的接口(也容易出现名称错误,因此App必须使用相同的编译器,或者以源代码形式包含库)
  • 在C#中使用也是如此吗?
  • 对于在Java SE/Java EE中的使用,Java本机接口(JNI)适用.我有一些关于它的基本知识,但我绝对应该仔细检查它.
  • 并非所有客户端语言都能很好地处理多线程,因此应该有一个线程与客户端通信
  • 对于在Java ME上的使用,没有JNI这样的东西,但我可能会使用嵌套VM
  • 要在Bash脚本中使用,必须有一个带命令行界面的可执行文件
  • 对于其他客户端语言,我不知道
  • 对于大多数客户端语言,使用该语言编写适配器接口会很好.我认为有一些工具可以自动为Java和其他一些人生成这个
  • 对于面向对象的语言,有可能创建一个面向对象的适配器,它隐藏了库的接口是基于函数的这一事实 - 但我不知道它是否值得努力

可能的子问题

  • 这是可行的,可管理的努力,还是只是太多的便携性?
  • 有关于这种设计标准的好书/网站吗?
  • 我的任何假设是错误的吗?
  • 哪些开源库值得学习从他们的设计/界面/源中学习?
  • meta:这个问题相当长,你有没有办法把它分成几个较小的?(如果您回复此问题,请将其作为评论,而不是作为答案)

c c++ portability

43
推荐指数
1
解决办法
6195
查看次数

如何在使用eclipse时在本地和SVN中布局文件夹

我一直在使用eclipse和SVN多年从一个开发人员到12人的团队,我总是设置我们的文件夹结构.我设法让它以某种方式工作,但我觉得我的文件夹布局远非最佳.我很难说出我的典型文件夹布局是什么样的,因为每次看起来都非常不同.

我现在正在开始另一个大项目,我想这次以专业的方式做.

关于该项目的事实

这些都是现在的事实:

  • 所有开发人员都将使用Eclipse
  • 一些人将使用Subclipse将SVN集成到Eclipse中,其他人将使用Tortoise SVN或svnX等外部客户端
  • 我们正在开发Windows和Mac OS
  • 我们使用ant来自动化构建和junit测试
  • 会有多个相互关联的项目:
    • 一个用纯java编写的库,因此它可以在所有已知的Java平台上运行
    • 几个java平台的几个应用程序(J2SE,J2ME,android ...).所有这些应用程序都依赖于之前提到的库

怎么处理.project?

我总是不确定是否提交了由eclipse生成的文件(比如'.project''和''.classpath'').在之前的项目中,有时我们将它们放入SVN,有时我们没有,这两种方法都有其优点和缺点.有一次,我们甚至承诺了整个工作空间,但这似乎是一个坏主意.

我当然缺少的一个关键概念是Eclipse如何处理其工作空间.默认情况下,整个项目位于工作空间文件夹中,但可能存在外部项目,这些项目以某种神奇的方式链接,我只是不明白.

可能的文件夹布局

我不确定如何在本地存储库中布局项目.我认为有三种可能性:

  • 工作区是我本地工作副本的子文件夹(如c:\ code\myWorkingCopies\projectXyz\trunk\workspace)
  • 我的工作区是我的工作副本(我使用c:\​​ code\myWorkingCopies\projectXyz\trunk\as workspace)
  • 我的工作区在某处(c:\ code\workspace)和我的工作副本在其他地方(c:\ code\myWorkingCopies\projectXyz\trunk)我有那些外部项目
  • 还有其他想法吗?

我在找什么样的答案?

一个虚拟的文件夹结构,可能是这样的(我只回答我自己的问题吗?):

  • 树干
    • 项目
      • 了projectA
      • 项目B

随着提示要检查哪里,像这样:

  • checkout trunk/projects to c:\ code ...)

还有一些指导者喜欢

  • 永远不要上传x,y,z类型的文件......

eclipse svn

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

如何在getter链中跟踪NullPointerException

如果我在这样的调用中得到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,我知道调试器是什么,但我无法弄清楚如何将它应用于问题.

我对答案的结论是:
有些答案告诉我,我不应该一个接一个地连接吸气剂,一些答案显示我如何调试我的代码,如果我不赞成这个建议.

我已经接受了一个答案,这个答案让我知道什么时候连接吸气剂:

  • 如果他们不能返回null,只要你喜欢就链接它们.不需要检查!= null,无需担心NullPointerExceptions(请注意链接仍然是demeter的法则,但我可以忍受)
  • 如果它们可能返回null,则不要永远不会链接它们,并对每个可能返回null的值执行空值检查

这使得对实际调试的任何好建议毫无用处.

java debugging getter nullpointerexception

26
推荐指数
4
解决办法
7765
查看次数

为什么在不同的编译器上编译C/C++代码很重要?

我对可移植性的不同方面感兴趣(正如你在浏览我的其他问题时所看到的那样),所以我读了很多关于它的内容.很多时候,我读/听说Code应该以一种可以在不同的编译器上编译的方式编写.

没有任何gcc/g ++的真实生活经验,在我看来它支持人们可以想象的每个主要平台,因此编译g ++的代码几乎可以在任何系统上运行.那么为什么有人会费心在MS编译器,英特尔编译器和其他人上运行他的代码呢?

我也可以想到一些原因.正如常见问题解答建议的那样,我会尝试将它们作为答案发布,反对将它们纳入我自己的问题中.

编辑:结论

你们让我完全相信有几个很好的理由来支持多个编译器.原因很多,很难选择一个被接受的答案.对我来说最重要的原因:

  • 贡献者更有可能使用我的项目,或者只要他们可以使用他们选择的编译器就可以使用它
  • 在任何地方都可编译,可用于未来的编译器和工具,并遵守标准是相互执行的,所以这是一个好主意

另一方面,我仍然认为还有其他更重要的事情,现在我知道有时它根本不重要.

最后,没有一个单一的答案可以说服我不要选择GCC作为我项目的主要默认编译器.

c c++ compiler-construction portability gcc

15
推荐指数
5
解决办法
2157
查看次数

保留已编译的java类中的参数/参数名称

当我编译这样的东西时:

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 eclipse compilation javac

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

如何处理J2ME上缺少的最常见的类

我正在尝试编写一个运行不同java平台的应用程序,如J2SE,J2ME,Android等.我已经知道我必须为每个平台重写大部分UI,但是想重用核心逻辑.

保持这个核心便携性涉及三个我所知道的缺点:

  1. 保持旧的Java 1.4语法,而不是使用Java 5.0的任何优秀语言功能
  2. 只使用已知可在这些平台上工作的外部库(即:不使用JNI,并且不依赖于违反此规则的其他库)
  3. 只使用所有这些平台上的

我知道如何克服(1):5.0风格的代码并自动将其转换为1.4(retroweaver - 尚未尝试过,但似乎没问题).

我认为(2)是一个我必须接受的问题.

现在我想知道(3)最好的工作环节是什么,特别是我最想念的收藏课程.我能想到这些:

  • 我只知道大多数程序员不使用Set,Map,List等,并退回到Vector朴素阵列.我认为这首先使代码变得丑陋.但我也知道正确的选择之间TreeSet/HashsetLinkedList/ArrayList对性能至关重要,而且总是使用Vector和Arrays也不对.
  • 我可以编写自己的类实现.这似乎是重新发明轮子,我想我不能像其他人那样做得那么好.
  • 由于Java是开源的,我可以获取J2SE Collections框架的源代码,并在构建J2ME时包含到我的应用程序中.不过,我不知道这是不是一个好主意.也许有充分的理由不这样做.
  • 也许已经存在库,它们重建了集合框架的最重要特性,但是针对低端系统进行了优化,而不是实现不经常使用的功能.你知道任何?

感谢您的回答和意见!

编辑:我终于找到了一个(复杂但很好)的解决方案,我想通过提供我自己的答案并接受它,解决方案将在顶部可见.但恰恰相反,我的答案仍处于最底层.

java portability cross-platform midp java-me

13
推荐指数
2
解决办法
4551
查看次数

C++中的软(非弱)引用 - 是否可能?有实施吗?

在C++中,我正在使用boost::shared_ptrboost::weak_ptr自动删除不再需要的对象.我知道这些工作与引用计数.

在Java中,内存是由垃圾收集器,其consideres管理的内置对象引用为,WeakReference因为SoftReference在之间(可通过GC收集,但可能还有生存的GC)的东西,这是非常方便的用于缓存对象一段时间,但一旦可用内存不足就将它们丢弃.

所以现在我回到了C++中,我错过了软引用的安慰.我想知道软引用是否适用于引用计数.当清除对象的最后一个引用,并且仍然有一个引用时,它什么时候会被删除?我可以想到一些方案,但对我来说似乎都不聪明.

为了防止软引用和引用计数有适当的语义,我想知道这是否已经实现,可能是以一种甚至兼容的方式boost::shared_ptr(或C++ TR1等效std::shared_ptr的方式).

如果两个问题的答案都是否定的,那么对象缓存场景中的替代方案是什么?

编辑: 当然我说的是缓存实际上很有用的情况,因为构造对象的成本很高(想想几次访问数据库和网络查询),但是有太多东西要永远保存它们.

c++ boost memory-management soft-references shared-ptr

6
推荐指数
2
解决办法
1681
查看次数

手机上的语义资料(RDF,OWL) - 有可能吗?

我正在考虑在移动设备上的应用程序中使用RDF和OWL等语义(Web)技术.目前我的目标是android,但我也对iPhone和J2ME的可能性感兴趣.

我想使用库而不是从头开始实现所有内容.

我知道有一些像Jena,Redland,Protégé这样的库/框架,但他们没有说明他们知道哪些平台可以工作.

拥有动态对象模型并从XML解析到XML是我必须拥有的.

我也想使用推理,但我被告知它是计算密集型的,所以这只是一个很好的选择.

对于所提到的所有平台,问题可以解释为

  • 理论上有可能吗?(特别是对于J2ME,我不确定)
  • 是否有已知可在这些平台上运行的库?
  • 移动平台上的性能是否足以满足现实世界的使用需求?

iphone android rdf owl java-me

5
推荐指数
2
解决办法
1967
查看次数

忽略来自 linting 和格式化的行 - VSC EsLint + Prettier

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)

javascript typescript visual-studio-code prettier-eslint

5
推荐指数
1
解决办法
5301
查看次数

如何在混合Java版本的世界中使用泛型?

我非常喜欢仿制药,并尽可能地使用它们.我偶尔需要在另一个项目中使用我的一个类,它必须在旧的JVM上运行(5.0之前),需要在JavaME上运行(不允许使用泛型)或者在Microsoft J#中运行(其中非常差)支持泛型).

目前,我手动删除所有泛型,这意味着也插入了许多强制转换.

由于泛型被认为只是编译时,并且每一段通用代码都可能自动转换为非泛型代码,我想知道是否有任何工具可以为我做这件事.

如果没有这样的工具,我怎么能解决这个问题呢?我应该完全停止使用泛型吗?

已经有与字节码兼容性相关的答案.如果由于某种原因我需要源代码兼容性怎么办?

java generics portability jvm

4
推荐指数
1
解决办法
625
查看次数

J2ME没有找到我的java.util.TreeMap实现

我在想什么

我正在尝试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 midp cldc treemap java-me

4
推荐指数
1
解决办法
1242
查看次数