Anders Liu (lover_P)的.NET天空

传播知识基于掌握知识,但又高于掌握知识。我要做一个掌握很多知识的传播知识的人!

刘彦博ID:loverP
105221次访问,排名754好友0人,关注者5
loverP的文章
原创 35 篇
翻译 5 篇
转载 0 篇
评论 190 篇
Anders Liu的公告


我写的书


购买途径:
最近评论
mldstk:wow power leveling
l763820708:有-在17号端口
txfast:这些话说的比较实际,其实说学习能力强只是一句空话,因为刚进公司,谁能够认可你的学习能力强,谁又能否定一个人的学习能力?
Wind_Eagle:想不到情人节还有心思写博客呀!不错,我有同感 !
heaso14:照着做了 还是有问题啊...

1>MSVCRT.lib(crtexew.obj) : error LNK2001: 无法解析的外部符号 _WinMain@16
1>C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\a\PureC\Rele……
文章分类
收藏
    相册
    MVP Logo
    文章用图1
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 [原创]使用Visual Studio .NET编写纯C程序的提示收藏

    新一篇: [原创]程序结构随想

    使用Visual Studio .NET编写纯C程序的提示

    作者:lover_P


        所谓的纯C程序,是指该程序(包括可执行程序或库)之源代码所用语法严格遵守C89标准,且所用之库函数,要么为C89标准所支持之标准库函数,要么为第三方以纯C程序所编写之库函数。

        上面是我对“纯C程序”做的一个非标准的、递归的定义。

        使用Visual Studio的朋友们都知道,作为Visual Studio套件的Visual C++集成开发环境并没有提供C语言编译器,我们只能使用C++编译器对C程序进行编译。尽管Eckel Bruce认为,用C++编译器来编译C程序可以发现程序中隐含的可能的错误(参见《Think in C++》),但我坚持认为这不是一个好办法:这只会让大家写出那些运用了大量C++特性的C程序。这种程序是不可取的。Bjnare Stroustrup也认为,C++应当是一门独立于C语言的、全新的程序设计语言;而我却觉得,C应该是独立于C++的、老树常青的语言。因此,我们需要一个能够编写纯C程序的开发环境和编译器。

        Visual Studio .NET中的C++编译器为我们提供了这样功能!Visual Studio .NET中的C++编译器不仅大大加强了对C++标准的支持,通过一些配置,还可以对纯C程序进行编译!在本文中我将对其配制方法进行一个简要的介绍,希望能够对那些喜欢纯C程序设计的朋友们有所帮助。也希望初学C语言程序设计的朋友能够写出漂亮的C程序。

    集成开发环境的配置

        首先,在建立项目的时候,选择Win32控制台应用程序即可,但一定要选择“空项目”选项。这样就能防止Visual Studio向导为我们产生不必要的源文件(代码)和设置一些不必要的编译器选项。具体操作方法见如下图示:

        选择“文件”-〉“新建”-〉“项目”:

        在“新建项目”对话框中,在“项目类型”李表框中选择“Visual C++项目”,并在“模板”列表框中选择“Win32 控制项目”模板。别忘了在“名称”文本框中输入项目的名称,这里我起名为“PureC”:

        点击“确定”按钮后,将弹出“Win32 应用程序向导”对话框,别急着点“确定”:

        最初,在我看到这个对话框的时候,还真没注意过“应用程序设置”这个选项(可能是我太笨了罢-_-b)。因此,我们要:

        点击“应用程序设置”选项卡,选中“附加选项”中的“空项目”:

        这一步是问题的关键。如果我们没有选择“空项目”,Visual Studio .NET的向导会为我们添加一些支持用于支持Windows应用程序的源文件(如“stdafx.h”、“stdafx.c”等),而且还会对编译器进行一些设置。尽管这些设置对于编写Windows API程序非常有用,但对于我们编写纯C程序来讲,是非常不利的。因此,我们有必要选择“空项目”。

        点击“确定”按钮后,我们便得到了一个空的项目,观察一下“解决方案资源管理器”列表框,我们发现,已经没有了向导为我们产生的烦人的多余的源文件了。这时,我们需要手动地将我们的源文件添加到项目中。在这里我们添加一个新的源文件“PureC.c”。在“解决方案资源管理器”列表框中的“源文件”文件夹图表上单击右键,选择“添加”-〉“添加新项”:

        在弹出的“添加新项”对话框中,选择“C++ 文件”即可。并在“名称”文本框中输入源文件的名称。注意,必须在文件名中写明扩展名“.c”,否则IDE将自动为该文件添加“.cpp”扩展名:

        接下来,我们要设置一下项目的属性。在“解决方案资源管理器”的项目(这里是“PureC”)上单击右键,在弹出菜单中选择“属性”。将弹出“属性页”对话框。在左侧的树状视图中展开“C/C++”节点,选择“高级”节点;在右侧出现的列表框中,将“编译为”列表项改为“编译为 C 代码(/TC)”:

        点击“确定”按钮,OK,大功告成了。

    控制台选项的配置

        这个题目有点……那个……了。我的直观感觉就是用控制台命令行编译程序的人应该都是虾(就算不是大虾,也得是个小虾),对于命令行的选项应该是了解的很了。我也就不过多献丑了,简单而言,只要在命令行中添加/TC选项,就可以把一个源文件编译为纯C代码。

    测试

        经过这样一番调教,我们中有了一个能够编写纯C代码的环境了。空口无凭,我们得用一段程序验证一下。为我们的PureC.c添加如下一段代码:

    /*
     * Model: PureC.c
     * Author: lover_P
     * Date: 2004-6-3
     *
     * Test the pure C envirment in VS.NET
     */

    struct A {
      int i;
    };

    int main() {
      A a;
      a.i = 10;
    }
    /* end */

        这段代码对于C++程序来说是完全正确的,完全可以通过编译且没有错误和警告。但这并不是“纯C程序”,因为在C标准中,当以结构类型作为变量类型时,在变量的声明语句中必须显式地出现struct关键字。因此,在我们这个“纯C环境中”编译这段代码,将会得到N多错误报告。

        因此,我们要把main()函数的第一行改为纯C形式的声明语句:

    struct A a;

        这样,再次编译,将是0错误0警告。

    总结

        最后,这个“纯C环境”只是辅助性的,要想学会编写“纯C程序”,首先要仔细学习标准C语言。不要指望这个环境能教会你写“纯C程序”,就像上面的例子,仅仅缺少一个关键字,在Visual Studio .NET 2003种将会得到这么多错误:

    e:\Workspace\C++\PureC\PureC.c(14): error C2065: “A” : 未声明的标识符
    e:\Workspace\C++\PureC\PureC.c(14): error C2146: 语法错误 : 缺少“;”(在标识符“a”的前面)
    e:\Workspace\C++\PureC\PureC.c(14): error C2144: 语法错误 : “<未知>”的前面应有“<未知>”
    e:\Workspace\C++\PureC\PureC.c(14): error C2144: 语法错误 : “<未知>”的前面应有“<未知>”
    e:\Workspace\C++\PureC\PureC.c(14): error C2143: 语法错误 : 缺少“;”(在“标识符”的前面)
    e:\Workspace\C++\PureC\PureC.c(14): error C2065: “a” : 未声明的标识符
    e:\Workspace\C++\PureC\PureC.c(15): error C2224: “.i”的左侧必须具有结构/联合类型

        如果你对标准C不是很了解的话,面对这么多错误肯定是无从下手的。因此,语言的学习是很重要的,环境只是一个辅助的功能。

        最后,祝大家能够学好这门最NB的语言。

    发表于 @ 2004年08月20日 21:50:00|评论(loading...)|编辑

    评论

    #lover_P 发表于2004-08-21 22:12:00  IP: 219.239.98.*
    to 周星星:这你就错了。真正的C/C++程序员因该能够熟悉各种平台,包括各种运行平台(即操作系统)和开发平台。况且,这篇文章仅仅是提示性的,能够对某些人甚至某一个人有所帮助,它就是有意义的。
    #周星星 发表于2004-08-21 13:09:00  IP: 210.96.123.*
    辛苦了,但意义不大,因为真正的C程序员和C++程序员是不会去使用VC.net的。
    #周星星 发表于2004-08-21 13:14:00  IP: 210.96.123.*
    而且 VC++6.0 中也可以做到,没有人会去使用VS.net的。
    #周星星 发表于2004-08-22 17:11:00  IP: 218.2.111.*
    to lover_P:可能是吧,但C编译器和C++编译器太多了吧,我看没有任一个人有精力去掌握她们。
    #lover_P 发表于2004-08-22 19:50:00  IP: 219.239.98.*
    to 周星星:是呀,其实我也只会用Visual Studio我从5.0就开始用,一直觉得它其实是个不错的编译环境。我挺喜欢微软的技术的,尽管他有些过分垄断行为,但他的产品还是不错的,很人性化。不要嘲笑我哦~~
    #风舞影天 发表于2004-08-25 11:09:00  IP: 218.88.36.*
    to 周星星:真是忍不住想骂你。刚才看一个微软的题,一个那么简单的东西你都看不出来,还好意思称自己精通OO,还要故意谦虚一下。连基础都不会你还谈C++基础上的OO,真不知道你脸皮有多厚。又好意思在这里说什么真正的程序员不用VC.NET,等你真正完全会使用VC.NET之后再放这些屁话吧,不然不要到处丢人现眼
    #yunshu 发表于2004-08-27 18:32:00  IP: 61.152.253.*
    请问下,这样编译的c程序是编译成可以脱离.net框架运行的吗?
    #lover_P 发表于2004-08-27 20:41:00  IP: 61.50.161.*
    当然了!“纯C”嘛!pure!
    #Figure 发表于2004-10-20 09:19:00  IP: 202.101.8.*
    我认为还是蛮好的,虽然GDB也不错,但个人还是感觉用VS去调试程序还是更方便一些
    #hhh 发表于2004-11-20 10:08:00  IP: 24.66.94.*
    谢谢你的文章,这个问题我苦恼一阵子了,怎么试也找不到
    谢谢啦
    #lover_P 发表于2004-12-03 13:57:00  IP: 218.247.132.*
    能对你们有所帮助我真是太~~~~高兴了!^____,^
    #Artist 发表于2005-02-15 17:32:00  IP: 221.198.52.*
    这个问题也困我好久了,我用的是.net2002英文版的,按你的方法作了,
    提示;These project configuration(s) art out of data:
    test(我的源文件名)-Debug Win32
    我对标准C不是很了解,我确实很急需这个问题!
    谢谢
    给我留个QQ或邮箱什么的
    我的QQ;155040889
    #怀沙 发表于2005-09-21 10:32:00  IP: 211.100.21.*
    TO:周星星
    今天无意间又在这里看到你关于VC6和VC.NET的论调,终于有点忍不住想说两句。
    诚然,VC6经过了比较长时间的考验,相对稳对一点,就像你自已所言,你对他的BUG了解得比较多,对VC.NET所潜在的BUG知之甚少。你也说你的工作决定你比较合适用VC6,但你也不必到处高举VC6的大旗而贬VC.NET吧,更不要说什么“真正的C程序员和C++程序员是不会去使用VC.net的”,什么是真正的C/C++程序员?你不喜欢但别人喜欢。请尊重别人的选择。

    不知道你是否觉得我这话说的有点道理,言语上有冒犯之处还请见谅了
    #HeMin 发表于2006-04-21 08:55:00  IP: 61.187.15.*
    lover_P ,你怎么那么久没上QQ了?在忙什么拉?
    我一看`这个文章2004年写的?`我快疯了`现在2006年了呢`
    那么就接触了.net??``
    我是要好好学习了
    #heaso14 发表于2008-04-06 02:09:50  IP: 218.80.70.*
    照着做了 还是有问题啊...

    1>MSVCRT.lib(crtexew.obj) : error LNK2001: 无法解析的外部符号 _WinMain@16
    1>C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\a\PureC\Release\PureC.exe : fatal error LNK1120: 1 个无法解析的外部命令
    1>生成日志保存在“file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\a\PureC\PureC\Release\BuildLog.htm”
    1>PureC - 2 个错误,0 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 =========
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © Anders Liu