C++/CLI与托管代码是一回事么?他们和传统C++哪个更标准?

owen1759 2010-03-09 12:17:45
各位,小弟最近由于一个项目需要用C++开发一个DLL,才开始研究C++的,看了许多教程,发现了不少疑惑(我使用的开发环境是Visual Studio 2008)
1.教程中写的是#include<iostream.h>,但是调试不通过,必须要改为#include<iostream>
2.因为想把getch()放在return 0前来查看输出,所以要包含conio.h,但是好像必须写成#include"conio.h",为什么这个头文件却不可以用尖括号?而且我记得许多年前学习C++时包含的好像是stdio.h而不是conio.h啊?
3.教程上完全没有任何using,但是调试的时候发现必须写using std::cout;using std::endl;等等才能正常使用cout、endl等,为什么教程上可以没有呢?
4.关于输出语句,有的用printf,有的用cout,前面两种好歹我学过,后来看资料居然还有用system.out.print的,这到底是怎么回事啊?
5.调试时用到了HINSTANCE hinst=::LoadLibrary("dll_nolib.dll");但是有的资料说参数要加_T("dll_nolib.dll"),有的资料说参数要写成L"dll_nolib.dll"的形式,前面有个字母L,搞得我都不知道是怎么回事了。另外顺便问问这个函数名称前面有两个冒号是什么意思?

后来我查了很多资料,似乎意思是现在都C++/CLI了,从VS2005开始对C++使用了托管代码,又似乎说托管代码必须在有.NET的机器上才能运行。但是我还是不太清晰,C++/CLI是个什么东西,它跟托管代码是不是一回事呢?上面说到的这些代码的变化是不是因为变成C++/CLI引起的?最标准的C++究竟是他们还是传统的C++呢?我不想使用.NET库也不想托管代码,只想编译出的*.exe文件是直接在机器上就能运行的,应该怎么做,相关的语法规则是哪些,调试环境应该怎么建立?只有使用VC6.0才可以么(我昨晚为这个刚刚装了VC6.0的)?
...全文
329 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
cl22333 2010-03-10
  • 打赏
  • 举报
回复
引用 18 楼 owen1759 的回复:
我得承认,我确实很久没碰C++了,准确的说我几乎从来没碰过C++。不过由于赶进度,所以我来不及详细拜读各位推荐的教程(实际上早些时候我一直在看《C++Primer第四版》中文版,看到一百多页了)
谢谢大家的帮助,不过我还是没有完全弄明白:
1.C++/CLI和托管代码是不是一回事呢?也就是说是不是只要用C++/CLI写的程序编译出来一定是托管代码,并且托管代码的C++项目都是用C++/CLI编写的呢?
2.大家的意思是,我说的那些问题与C++/CLI无关,而是由于C++本身的版本原因,那么可不可以告诉我最新版本C++相对于以前都有哪些语法上的变动呢?(从别的地方复制来的也算数)
3.既然用VS2008也可开发C++的程序(相对于C++/CLI程序或托管代码),那怎样创建项目(或怎样设置)才能使用C++语法而非C++/CLI,并且使编译生成原始码的程序而非依赖.NET平台才能运行的托管程序呢?总该有某种区别吧


1.不是一回事,托管代码是中间代码,还可以用C#和Java生成,前提是在vs2003以上中生成,并且选择了托管代码方式。
2.标准C++的英文网址也贴出来了,这玩意好像也没什么人去翻译。你要是看不懂英文,我也没办法。那些语法和使用方式的变化,全说出来就可以写本书了。我也没见过谁用中文总结过。
3.vs在create new project时,会有选项的,你选mfc方式就行了,那就是不用托管代码的。关于vc的使用,你最好再找本vc技术内幕看看。
CCCCCCCCCCCCCCC 2010-03-10
  • 打赏
  • 举报
回复
太杯具了
引用 18 楼 owen1759 的回复:
我得承认,我确实很久没碰C++了,准确的说我几乎从来没碰过C++。不过由于赶进度,所以我来不及详细拜读各位推荐的教程(实际上早些时候我一直在看《C++Primer第四版》中文版,看到一百多页了)
谢谢大家的帮助,不过我还是没有完全弄明白:
1.C++/CLI和托管代码是不是一回事呢?也就是说是不是只要用C++/CLI写的程序编译出来一定是托管代码,并且托管代码的C++项目都是用C++/CLI编写的呢?
2.大家的意思是,我说的那些问题与C++/CLI无关,而是由于C++本身的版本原因,那么可不可以告诉我最新版本C++相对于以前都有哪些语法上的变动呢?(从别的地方复制来的也算数)
3.既然用VS2008也可开发C++的程序(相对于C++/CLI程序或托管代码),那怎样创建项目(或怎样设置)才能使用C++语法而非C++/CLI,并且使编译生成原始码的程序而非依赖.NET平台才能运行的托管程序呢?总该有某种区别吧
evanxgsh 2010-03-10
  • 打赏
  • 举报
回复
Mark
owen1759 2010-03-10
  • 打赏
  • 举报
回复
我得承认,我确实很久没碰C++了,准确的说我几乎从来没碰过C++。不过由于赶进度,所以我来不及详细拜读各位推荐的教程(实际上早些时候我一直在看《C++Primer第四版》中文版,看到一百多页了)
谢谢大家的帮助,不过我还是没有完全弄明白:
1.C++/CLI和托管代码是不是一回事呢?也就是说是不是只要用C++/CLI写的程序编译出来一定是托管代码,并且托管代码的C++项目都是用C++/CLI编写的呢?
2.大家的意思是,我说的那些问题与C++/CLI无关,而是由于C++本身的版本原因,那么可不可以告诉我最新版本C++相对于以前都有哪些语法上的变动呢?(从别的地方复制来的也算数)
3.既然用VS2008也可开发C++的程序(相对于C++/CLI程序或托管代码),那怎样创建项目(或怎样设置)才能使用C++语法而非C++/CLI,并且使编译生成原始码的程序而非依赖.NET平台才能运行的托管程序呢?总该有某种区别吧
cl22333 2010-03-09
  • 打赏
  • 举报
回复
纠正下错误,上面提到的C++99应该是C++98标准。我之前记错了。
cl22333 2010-03-09
  • 打赏
  • 举报
回复
补充下,
最标准的C++在这里,最新在用的是C++99,这个网站中说的是快要确定的下一代标准。
http://www2.research.att.com/~bs/C++0xFAQ.html#when-standard
vs只是个集成编译环境而已,只是照着上面的那个standard做实现而已。当然微软也会往里面塞些乱七八糟的东西,比如托管代码什么的,但是保证和C++ standard最大限度的兼容是最基本的,vs2008的支持度有98%以上。
如果不是维护原有代码,VS6可以不用管了。那个东西出来的时候,C++99还没确定,支持度连50%都没有,连stl都没法用。
cl22333 2010-03-09
  • 打赏
  • 举报
回复
首先说明一下,C++/CLI是微软自己搞的一套标准,有多少人用还是说不准的事。完全不管这个都行,用这个能做的,用标准c++肯定也能做出来。从你的问题来看,你对C++非常不了解,最好先看几本C++的教材。除了上面有人说的C++ Primer Plus外,C++ Primer是比较全面的C++基础教材。这是两本书,不要搞混了。另外,是不用从2005学起的,vs只是个ide而已,用最新的就行了。

1. #include <iostream.h> 这种写法不符合c++的最新标准。

2. getch()是c的用法,vc中直接ctrl+F5就可以看结果了。你要是非要用,可以用Cin()代替。

3. using是用来指定名称空间namespace的,这是C++相对于C增加的一个重大改变,建议你好好看看上面我说的那两本书中的内容。把你那本用C的思维方式说C++的教程烧掉。

4. printf是沿用C的语法,C++中不鼓励使用,最好多用Cout()。某些极端追求效率的时候可能会有些人考虑用。那种情况大部分人应该都不会遇到。至于system.out.print,这种微软闭门造车搞出来的东西,可以直接无视。

5. _T或者L是用来标明后面字符串的编码的,这是为了在不同字符编码环境中不会出现编译错误。那个写法不出问题用哪个就行了。两个冒号代表的是global(全局)的namespace。

最后,你的这些问题除了第四个外,和C++/CLI与标准C++之间的差别没什么关系。
关于托管代码,那也是微软搞出来的一种中间代码,运行机制可以用java虚拟机的方式来类比理解。
djlxue 2010-03-09
  • 打赏
  • 举报
回复
C++ Primer Plus 支持 我看了2遍了
CCCCCCCCCCCCCCC 2010-03-09
  • 打赏
  • 举报
回复
lz是不是很多年没碰过C++了?
canyingwushang 2010-03-09
  • 打赏
  • 举报
回复
建议你买本《C++ Primer Plus》从头学学,用VS2005吧!
vrace 2010-03-09
  • 打赏
  • 举报
回复
楼主提到的内容没有一个是由于引进 C++/CLI 引起的,基本是由于教程和标准的C++‘不兼容’引起的,hehe
vrace 2010-03-09
  • 打赏
  • 举报
回复
system.out.print 是 java 的玩意儿, C++/CLI 用的是 System::Console::WriteLine
  • 打赏
  • 举报
回复
C++/CLI 是 微软创造的语言
C++也是一种语言跟C++/CLI关系不大。

system.out.print则是C++/CLI中 用的输出语言,C++没这玩意。
  • 打赏
  • 举报
回复
你的教材 太老了......
_JeffreyWu 2010-03-09
  • 打赏
  • 举报
回复
引用 2 楼 barbara2008 的回复:
简单的说就是, 托管代码就是需要托管的,不能自己执行
需要一个语言解释器,例如 .NET框架

学习
最帅马老师 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 fancymouse 的回复:
>教程中写的是#include <iostream.h>
>教程上完全没有任何using
那教程已经老了

>C++/CLI与托管代码是一回事么?
是。顺便vc6似乎写不了托管。

>他们和传统C++哪个更标准?
m$的那套就没进入过c++标准

>后来看资料居然还有用system.out.print的
CLI那套有谁在用么?

>前面有个字母L,搞得我都不知道是怎么回事了。
宽字符串

>另外顺便问问这个函数名称前面有两个冒号是什么意思?
全局函数


讲得很具体
djlxue 2010-03-09
  • 打赏
  • 举报
回复
5、冒号:不是调用你类里面的成员函数,而是调用全局的API函数,刚看错了 不好意思……
djlxue 2010-03-09
  • 打赏
  • 举报
回复
1、C++ 标准中是用 iostream 你看的iostream.h 可能是VC6中的
2、vs2008中不用getch 直接ctrl+F5 就行了
3、你使用的这些函数都是在std命名空间里定义了,标准C++都需要这样用
4、printf是C里面的。
cout是C++里面的。
system.out.print JAVA or C#里面的
5、L是说明是宽字符 “”是说明之字符常量
FancyMouse 2010-03-09
  • 打赏
  • 举报
回复
>教程中写的是#include <iostream.h>
>教程上完全没有任何using
那教程已经老了

>C++/CLI与托管代码是一回事么?
是。顺便vc6似乎写不了托管。

>他们和传统C++哪个更标准?
m$的那套就没进入过c++标准

>后来看资料居然还有用system.out.print的
CLI那套有谁在用么?

>前面有个字母L,搞得我都不知道是怎么回事了。
宽字符串

>另外顺便问问这个函数名称前面有两个冒号是什么意思?
全局函数
barbara2008 2010-03-09
  • 打赏
  • 举报
回复
简单的说就是, 托管代码就是需要托管的,不能自己执行
需要一个语言解释器,例如 .NET框架
加载更多回复(1)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧