在过去的5年里,我一直在专业地编写Java.最近,我不得不深入研究JNI以调用一些Windows特定功能.
这种经历凸显了我对C(或C++)语言的不良掌握.我对C的唯一介绍是11年前我在高中读过的一本简短的"假人"书.
我知道这两种语言在那段时间内都有所进步,尤其是C++和标准库.
学习C或C++对我来说是否合适?哪本书最好?
人们也对Windows编程有任何建议吗?我可以通过MSDN很好地阅读某些API调用,但我有一种感觉,我错过了关于"大图"的事情.
谢谢
好问题.从表面上看,推荐C++是显而易见的,因为"它的面向对象就像Java".唯一的问题是,它不是真的.C++允许OOP,是的,但它只是C++支持的几种范例之一.像OOP语言一样处理C++(特别是像Java一样对待它)只会导致沮丧.
问题是Java和C++实际上并没有太多共同之处.Java程序员经常认为Java受C++的启发,但只有在C++中你才意味着最早的C++版本,这可能更适合称为"C with classes".从那以后,C++以自己的方式完全转变为自己的语言.从那以后,它可能比Java有了很大的改变.那时的Java程序员仍然能够理解今天的Java代码.对于C++来说并非如此.所以我认为C实际上比"现代C++"更接近Java.如果您使用Java并删除了GC以及类的概念和其他一些抽象,那么C就是您所获得的.要获得C++,
此外,C++是一种非常复杂的语言,学习它需要很长时间.如果你不能很好地学习它,那么你将会一次又一次地用脚射击自己.
最后,这取决于你的目标.C++是一种比C语言更现代的语言,一旦你学会了它,就会非常富有表现力和强大,而且令人惊讶的是,它甚至可以非常优雅和简洁.但学习曲线令人讨厌.所以从长远来看,对于原生编程,我建议使用C++而不是C语言.
但是,如果您的目标主要是与Win32 API(或其他本机API)进行交互,那么您将不需要C++.Win32和大多数其他API都是用C语言编写的,而不是C++,在任何情况下,你很可能不需要非常复杂的代码来连接它和Java.
关于学习Win32,你是对的,你需要的所有细节都在MSDN上.如果你想要全局,那么Petzold就是这本书的主题.
我想这取决于你的目标.
如果你想靠近机器,那么C.
如果你想补充C语言之上的OO类Java层的知识,那么C++.
加速C++(已经过卫生处理的Amazon链接)是一本很棒的书,从C++的角度来学习C++,而不只是C和其他位置,
和K'n'R C(消毒亚马逊链接)仍然是学习C恕我直言的方式!
BTW For C++跟进Scott Meyers在Effective C++书籍中的智慧!还有他的Effective STL书.
HTH
干杯,
抢
学习足够的C++,将其用作"更好的C".您不必尝试将所有内容映射到您对Java的理解上.你想要的只是能够使用C++对象作为抽象数据类型,新的和删除等.如果STL出现,那就更好了.
真正的问题是:为什么你认为JNI是绝对必要的?Windows调用将破坏保持您的应用程序可移植性的任何想法.我坐在一个不得不深入研究使用JNI的Java应用程序的人旁边.它会随机关闭带有SEG FAULT的服务器.他的假设是堆填满,对一个调用malloc在堆上分配空间的例程进行JNI调用.它不可用,例程不会检查返回的指针是否为null,是否释放它,然后是服务器.他仍在尝试在本地重现错误,因为它需要精确的时间来在GC启动之前调用JJNI方法.
100%肯定他们是必需的吗?只是问问而已....
如果您对Java有很好的理解,我建议从C开始,如果直接使用C++,它与Java之间存在很多差异,您可能会不喜欢它.
如果你认真学习这两种语言我会推荐Bjarne Stroustrup的"The C++ Programming Language"和Dennis Ritchie的"The C Programming Language".