`
lovnet
  • 浏览: 6813015 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++与C#对比学习:预编译与编译机制(二)

 
阅读更多

常用预处理指令

C++中常用预处理指令

前面讲了主要有四种1.include引用头文件 2.条件编译#define #ifdef等 3.#define定义宏 4.progma

1.include引用头文件

我们经常会看到#include "ABC.h" 和#include <iostream>这样的写法. "ABC.h"这样带个h的预编译时直接在当前项目目录上去找.而<iostream>这样的是去系统目录中.那你可能会问系统目录在哪里啊? 我找了下也没找着.只在C盘中找到个有啥WinDef.h和Windows.h这些头文件的目录.反正就是装VS时指定的一些啥目录吧.你编译时它VS肯定能找到的.而且那也是些早写好的.h文件,跟你写的头文件没啥不一样.

另外我发现"stdafx.h"这个头文件只能放第一行,如果你把#include <iostream>放它前面去了,实际上就没有引用到iostream.我也不知道这是为啥来着啊

2.条件编译

如果你需要装软件整成不同的版本,比如企业版或精简版之类啊.或者要想加入些debug时用到的代码就可以用到条件编译.这是两种最经常用到条件编译的场景.

#include "stdafx.h"

#include <iostream>

#define GOD

void main()

{

#ifdef GOD

std::cout<<"my god";

#else

std::cout<<"hell";

#endif

}

上面就是条件编译的简单用法.像if条件一样,你还可以多来几个else if,不过如果用else if的话应该这样写#elif

你假如在这里没用定义GOD,而是在其他头文件中定义了,然后添加头文件引用.那也相当于定义了GOD.还有就是GOD的定义只能定义在所以头文件之后,

3.#define定义宏

2中讲到了用#define来实现条件编译.实际上用#define还可以定义些宏,相当于起替换作用.

例如#define PI 3.14

你在代码中就可以用PI来代替3.14使用了.在C中使用这样的宏很多.但在C++中是不建议过多的使用宏的.如果像上面宏定义一般在C++中应该用一个const常量.而如果是用宏定义一个简单函数,则一般建议用内联函数(inline)

4.#progma

progma一个用处是隐藏一些编译时的警告信息.不过这个应该不常用.如果你用VS的话常用的是#progma once .可以防止头文件被多次编译.与这样定义宏的作用一样

#ifndef _HEADER #define _HEADER .... #endif

不过貌似#progma并不是所有的编译器支持吧.你用VS时没问题,如果代码放到另外一个编译器去可能不识别了.

另外还有个#progma region可以起到注释的时候

比如#progma region this function is used for connecting oracle

//some source code

#end region

你这样写之后在VS的开发环境中,就会在最左边的边界显示加减号,你可以点击展开或收缩这一堆代码,收缩时只显示this function....这些信息,相当于是注释信息.当然#progma region跟#progma once一样在其他编译器中未必支持

C#常用预处理指令

C#中的预处理语法跟C++差不多,但用的不多,有些功能可以用特性(attribute)实现,而且attribute的功能更强大.当然有些地方还是会用到预处理.

由于C#中没有头文件,所以也没有#include这指令.在C#中用的比较多的还是条件编译.用法几乎跟C++一模一样.只有一个小区别,C++中用#ifdef来判断而C#更简单,直接用#if

然后像C++中#define PI 3.14这样定义一个宏,在C#中不能使用了,会当作错误处理

#progma 的话还可以用来隐藏警告信息

比如#progma warning disable 438

//some code

#progma warning restore 438

处于中间的那些代码如果出现438类型的警告就不报出来.其他地方还是会提示警告.

#region

//code

#endregion

这个东东和C++中的#progma region作用完全一样.而且#region是C#语言规范中规定的语法.说到注释我想说点题外话,怎么写好注释

怎么写好注释

可能我们大部分人都会经常听说注释多重要.看没有注释的的代码是件痛苦的事.当我自己在工作中实际接触到一百多万行的代码时感触更深.

一说到注释我们最容易联想到的是/*this is comments*/ 或者//this is comments 这样的狭义上的注释. 也是我们最常用到的注释.也确实是非常必要,不可缺少的.但实际上你会发现,如果源代码超级多了,你还加很多这样的的注释进去会严重干扰我们看代码的.所以这样的注释一多还会起了负面作用.所以实际工作中,这样的注释写是一定要写,但要把握一个度,只有一些逻辑性比较强,不写注释不容易看懂的地方才加注释.

而我们要多写广义上的注释.就是命名类,函数,变量时尽量用一些有实际含义的英语单词.让人家一看就明白这类和函数是干嘛的,这种自解释的命名是最好的注释.另外项目代码一多,你如果埋头看代码可能会分不清方向.此时就会意识到设计文档是多么重要了啊.看下设计文档就对整个项目有个大概的了解,知道大的方向,才不会陷入代码的具体细节中.而且面向对象语言很好的把代码模块化了.一个大项目往往是一个solution下面很多project,然后project下面很多类.看了设计文档后知道每个project大概是干嘛的,各个project间怎么交互的.然后就可以有针对性的去看代码了.

分享到:
评论

相关推荐

    C/C++和C#混合编程

    C#和C++在编译过程中的区别主要体现在它们的目标代码上:C#编译成微软中间语言(MSIL),而C++通常直接编译成本地机器码。这种差异导致了两者之间直接调用的困难,特别是当涉及到类和对象时更是如此。传统的...

    C++与C#应用:C++调用C#DLL 示例源码

    本示例探讨了如何在C++程序中调用C#编译的动态链接库(DLL)的功能,这对于那些需要利用C#特性但又不能完全放弃C++项目的开发者来说尤其重要。下面我们将深入讲解这个主题,首先理解C++和C#的基础,然后详细解释如何...

    C++反射库--RTTR预编译包

    RTTR通过提供一种预编译的机制,使得C++开发者也能享受到类似于Java或C#等语言的反射功能,而无需破坏类的继承结构。 RTTR的工作原理主要基于元数据(metadata)和元对象(meta objects)。它允许你在编译时对类、...

    C++调用C#类库

    1. **配置#using指令**:在C++/CLI代码中,我们需要使用`#using`指令引入C#编译后的DLL(动态链接库)。这相当于C#中的`using`语句,但用于引用.NET的程序集。例如: ```cpp #using ``` 这里,`MyCSharpLibrary.dll...

    c++ 与c#的中文字符串传递演示demo

    首先,我们要明白C++和C#之间的互操作性主要依赖于.NET框架的P/Invoke(Platform Invoke)机制。 1. **C++ 编译为 DLL** C++编写的代码可以通过创建动态链接库(DLL)来供其他程序调用。DLL文件包含可重用的函数和...

    C++与C#的一些比较

    预处理器指令在C++中用于条件编译,而在C#中,这些功能更多地被编译器特性所取代,如`#if`、`#endif`等。C#不使用头文件,而是使用`using`指令来引用命名空间。 异常处理方面,C#的`try`-`catch`-`finally`结构比...

    C#调用C++编译的DLL

    因此,学习如何在C#中调用C++编译的DLL是非常实用的技能。 #### 二、托管与非托管代码的区别 - **托管代码**:指使用.NET框架编写的代码,由CLR(公共语言运行时)管理,提供了垃圾回收等自动内存管理功能,提高了...

    c++与c#互调的例子

    P/Invoke允许C#代码调用非托管代码,如C++编译的DLL。为了实现这一点,需要在C#中定义与DLL函数匹配的委托类型,并使用`DllImport`属性标记该委托,指定DLL的路径和函数名。例如,如果C++ DLL有一个名为`AddNumbers`...

    C++ C#混合编程

    6. **异常处理**:C++和C#的异常处理机制不同,C++使用try-catch-finally,而C#使用try-catch。混合编程时需要考虑两者的兼容性,通常C++会捕获所有异常并转化为 HRESULT 错误代码,而C#则需要解析这些错误代码。 7...

    MessagePack在C++和C#间传输数据

    在C++端发送这个二进制流,可以通过网络套接字或者其他I/O机制。 在C#端,你需要使用MessagePack for .NET库。同样,定义相应的数据模型来匹配C++端的数据结构。MessagePack for .NET提供了类似于C++的API,可以...

    C++转C#的自动工具

    "你可以扩展其他方面的语法转换"意味着该工具可能提供了一些自定义或扩展的机制,允许开发者针对特定的C++特性或库进行定制化的转换规则,以确保转换后的C#代码能够正确运行并保持原有的功能。 在实际使用这种转换...

    C++调用C#的DLL程序实现方法

    把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL。 SwfDotNet是.net下输出flash的类库。SwfDotNet是C#编写的,作者的C#水平,真是令我佩服。这是个特别好的读写Swf文件的库。但是,我要用在C++项目...

    C++和C#的却别与各自的用法

    5. 结构体(struct)与类(class):C#中的struct是值类型,而class是引用类型,这与C++不同。C++的struct与class主要区别在于默认访问权限,但在C#中,struct和class有本质的内存管理差异。 6. 语法差异:包括数组...

    C++代码转C#

    - 转换的挑战包括:C#的垃圾回收机制与C++的内存管理不同,C#的面向接口编程与C++的面向对象编程有所差异,以及C#的特性如属性、事件和委托在C++中的实现方式等。 4. **配置文件**: - `Demo C# to C++ Converter...

    使用Swig转换C++库到C#示例代码

    通过查看和运行这个测试应用程序,我们可以学习到如何在C#中创建实例、调用方法、传递参数以及处理返回值,这些都是C#与C++交互的关键点。 在实际操作中,首先,我们需要阅读`SWIGDocumentation.pdf`以理解Swig的...

    Protobuf编译C++和C#文件,带例子

    标题中的"Protobuf编译C++和C#文件,带例子"指的是使用Protocol Buffers(简称Protobuf)这一数据序列化工具,为C++和C#编程语言编译定义的数据结构。Protocol Buffers是Google开发的一种高效、灵活且可扩展的数据...

    非托管C++调用C#的dll

    非托管C++是指使用传统的C++编译器编译的代码,它不能与C#代码集成,需要使用一些特殊的技术来调用C#编写的dll。 知识点3:CLR VIA C#的作用 CLR VIA C#是一种技术,它可以在非托管代码中手动启动CLR来加载应用...

    C++\C#反编译器

    提示:加了壳的不行,大家下的时候注意,别无必要的下载。

    C#与C++混合编程.pdf

    C#与C++混合编程涉及到将两种不同类型的代码(托管代码与本地代码)进行交互式调用,这是一个在软件开发中常见的需求。C#(发音为“看井”)是一种由微软开发的高级编程语言,它是一种面向对象、类型安全的编程语言...

    c++ to c#c++ to c#c++ to c#c++ to c#c++ to c#c++ to c#c++ to c#c++ to c#c++ to c#

    9. **编译和运行环境**:C++代码编译成可执行文件,而C#编译为中间语言(IL),在.NET环境中通过CLR(Common Language Runtime)运行。 10. **UI开发**:C++可以与WinAPI或Qt等库配合开发图形界面,C#则使用Windows...

Global site tag (gtag.js) - Google Analytics