Fighting Ant

Ant can be great while elephant can be chickenshit

导航

预定义,宏定义

Posted on 2008-07-04 11:03  Nillson  阅读(3445)  评论(1编辑  收藏  举报

上学的时候就没搞清楚这两个东东的关系,原本以为是多么难得事情,今天仔细瞧瞧就那么回事。(浮躁的大学哦.....)

宏定义:

其作用就是“换其名曰”,给程序中的一段特殊的代码--函数,数据取了个简单明了的名字。不过有一点这家伙的作用范围是全局的。即使它是在某一个函数块中定义的。这个其实也容易理解。因为宏定义是预定义的一种,在我们的程序之前,由预编译器(Cpp)提前编译出来了,那个时候程序里的结构是个啥样子编译器压根就不知道。所以作用范围是全局的是“必须”的。在C#中宏定义是不被支持的!!俺觉得这个决定是对的。因为这玩意儿本身就破坏类的封装性,如果需要全局静态变量,完全可以定义一个静态类的静态成员。

    class Test
    {
        public void test()
        {
            Console.WriteLine(parameters.para);
        }
    }
    static class parameters
    {
        public static string para = "something";
    }


宏定义与静态变量:

静态变量与宏定义其实没啥关系,所谓的静态,也只是说它存储的位置实在“全局变量的内存区”但是它使用起来还是有范围限制的。

宏定义与常量:

宏定义与常量都有“换其名曰”的作用,但是宏定义的作用范围只能是全局的,而常量是在编译过程中由编译器搞出来的,所以常量的作用域有全局和局部之分。如果在一个函数中定义了一个常量,那么这个常量的作用范围就仅限于这个函数。而如果在这个函数中定义了一个宏定义,那么这个宏定义在函数外也是可以访问定的。为嘛?因为人家是在编译之前就被搞出来的。跟这个函数其实没多大关系,所以偶感觉如果要定义一个宏,干脆直接定义在文件头部分。简单明了。

预定义:

预定义算一种特殊的机制吧,就是有一些变量或函数需要在我们程序被编译之前就被搞出来,那么就需要在编译器发挥作用之前启动一个叫预编译器的东西,它会搜索程序里边带"#" 的代码,然后把它们提前给编译了。这之后再启动编译器进行编译。预定义指令其实是为了配合这种机制而定义出来的旨在我们的程序中对需要与处理的代码段进行标识的一种命令。他的作用包括宏定义,文件包含,和条件编译。

宏定义我们已经唠叨完了,文件包含就是我们常见的#include,这里头还是要啰嗦一下气候的规则#include<iostream.h>和#include<iostream>是由于标准的不一样,由于有些大牛觉得".h"文件作为头文件表示不利于统一,所以就早早的把这个给去掉了。还有另外的原因就是<iosteam>和<iostream.h>里边的标准也变了,说白了就是不是一个文件了,里边的东东发生了变化,用#include<iostream>会包含进去一个比较新版本的iostream(扩展名未知). <>和""的区别在于查找的位置不一样,<>从标准库的头文件中开始查找,""从用户自定义的头文件库中开始查找。

余下的预定义指令就挂在下边,比较好理解。可以说预编译机制是一个“无奈”的机制,预编译指令最终的归宿应该是被嵌入到代码中,与其他的代码一起被编译器编译。

最后---在许多年之后---将Cpp放逐到程序开发环境里,与其它附加性语言工具放到一起,那里才是她应该呆的地方。” 一个大牛说的,了解了就行。

#define          宏定义

#undef           未定义宏

#include         文本包含

#ifdef           如果宏被定义就进行编译

#ifndef          如果宏未被定义就进行编译

#endif           结束编译块的控制

#if              表达式非零就对代码进行编译

#else            作为其他预处理的剩余选项进行编译

#elif            这是一种#else和#if的组合选项

#line            改变当前的行数和文件名称

#error           输出一个错误信息

#pragma          为编译程序提供非常规的控制流信息