请高手用严谨的话回答一下我的问题,谢谢!
我的问题如下:
如果用C++写程序,无非就是用C++的特性和它的类库来组织程序。那为什么经常说某某程序是运行在哪个Windows(2000,XP等等)上?
有人这样回答我:C++的特性和它的类库来组织程序,还不够!要在windows下运行,必须要使用windows的API。但是不同的windows,它的API稍微有点不同。所以有些程序在win2000下能运行,但是在xp就不能运行.(他还补充了一句:如果是一个标准windows程序,一定要使用windows的API)
但我也曾看到有人这么说:MFC是一个微软提供的基础类库,它封装了windows里的API.
到底是必须要用windows的API,还是类库已经把它封装了?
还有就是补充的那句话对我来说也是一个问题:什么是标准windows程序,难道还有非标准windows程序吗?
请高手用严谨的话回答一下我的问题,在此先提前谢谢了!
[解决办法]
如果用C++写程序,无非就是用C++的特性和它的类库来组织程序。那为什么经常说某某程序是运行在哪个Windows(2000,XP等等)上?
-------------------------------------------------
程序总是在操作系统之上运行的(除非你写操作系统或者某些设备驱动程序),而不同的操作系统之间有很大的不同,于是程序很难在所有的操作系统上都运行(java,.net可以让自己的程序在所有os上运行,他们的方法是在操作系统之上再加一个抽象层,从而屏蔽系统之间的不同),所以程序往往只是在某些操作系统上运行。因此,经常说一些程序在windows下运行,而在linux下不能运行,反之亦然。
到底是必须要用windows的API,还是类库已经把它封装了?
-------------------------------------------------
如果你在windows下编写c/c++程序,那么c/c++的库就是对windows api的封装,比如说,你可以使用fopen打开一个文件,fopen实际上在内部会调用windows api来打开文件,因为windows api是在windows下打开文件的唯一方法。那么,为什么你应该使用fopen打开一个文件,而不是使用windows api来打开一个文件?原因在于你希望编写在多个平台上可以编译的程序,如果你使用windows api,那么你的代码只能在windows下编译运行,如果你使用fopen,你的代码可以在windows,linux等下面编译运行,因为fopen为每个os提供了一个实现版本。这里援引某人的著名言论,“任何一个计算机问题都可以通过引入一个抽象层得到解决”。不过,如果你希望使用os提供的某些特性,你仍然需要使用os的api。
什么是标准windows程序,难道还有非标准windows程序吗?
--------------------------------------------------
没听过标准windows程序的说法,至于非标准windows程序,不知道在其他系统上运行的程序算不算:)
[解决办法]
C++是语言,要想运行,必须编译为依赖某个硬件或者软件平台的程序。
编译为在某个软件或者硬件平台上程序之后,必须依赖所在的平台提供的系统级别的api。
[解决办法]
操作系统有很多功能,其中之一就是提供用户和计算机之间的接口,如果没有操作系统,程序没法在裸机上运行。这个接口也有好几种,其中提供给程序员的就是api。
[解决办法]
不论你用什么语言写的程序,都是要运行在一定的操作系统之上,最终还是要调用操作系统的API,只是有时候你不是直接调用而已。
[解决办法]
。。废话
C++又不是专门为WINDOWS开发的。。
WINDOWS下开发,不用点专门针对WINDOWS的API,行吗
[解决办法]
如果用C++写程序,无非就是用C++的特性和它的类库来组织程序。那为什么经常说某某程序是运行在哪个Windows(2000,XP等等)上?
~~~~~~~~~~~~~~~~~~~~~
我的理解是:如教科书上所说,操作系统提供文件管理、设备管理、......等等功能,体现在实践上,就是提供了一大堆的API供用户调用。比如DOS系统,提供了各种中断功能(相当于windows API吧),服务于程序,你可以直接利用他们,有时候也可以绕过他们,直接对特定的硬件编程。
C++的类库,如果类库涉及到文件管理、设备管理等等功能,也是调用了Windows API。(不过我没做过底层方面的编程,不知道可不可以如dos般直接绕过这些API。)
某某程序运行在哪个windows上,只是说某个程序利用了某版windows的新功能。比如控件,很多控件都在windows新版中都增加了新的功能。
[解决办法]
是“必须”。只不过不是由你写的代码直接调用的。编译器必须要在你写的代码上加上很多东西才能把你的程序编译成可执行文件。
[解决办法]
必须,即使你只写了一个int main(){ int i=0;return 0;}
那个_CRTStartUp依然涉及到了操作系统的进程管理的API,而UNIX依然运行不了你在windows平台上编译出来的exe。