宏定义与预定义

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

宏定义:

其作用就是“换其名曰”,给程序中的一段特殊的代码--函数,数据取了个简单明了的名字。不过有一点这家伙的作用范围是全局的。即使它是在某一个函数块中定义的。这个其实也容易理解。因为宏定义是预定义的一种,在我们的程序之前,由预编译器(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          为编译程序提供非常规的控制流信息

 

 

文章来源 http://www.cnblogs.com/ppchouyou/archive/2008/07/04/1235360.html

build.gn 是一个构建系统配置文件,用于定义项目的构建规则依赖关系。在 build.gn 中,预定义宏定义可以用来控制编译过程代码生成。以下是一些常见的预定义宏定义及其用途: 1. **条件编译**: - 通过预定义宏定义,可以在编译时根据不同的条件编译不同的代码。例如: ```gn if (is_linux) { configs += [ "//build:linux_config" ] } ``` 这段代码表示如果是在 Linux 系统上编译,则应用特定的配置。 2. **定义常量**: - 可以通过预定义宏定义来定义常量,这些常量在代码中可以直接使用。例如: ```gn config_defines += [ "DEBUG_MODE=1" ] ``` 这段代码定义了一个名为 `DEBUG_MODE` 的常量,并将其值设置为 `1`。 3. **包含路径**: - 通过预定义宏定义,可以指定头文件的包含路径。例如: ```gn include_dirs += [ "//third_party/foo/include" ] ``` 这段代码指定了一个包含路径,使得编译器在编译时能够找到指定目录下的头文件。 4. **库路径**: - 同样,可以通过预定义宏定义来指定库的链接路径。例如: ```gn lib_dirs += [ "//third_party/bar/lib" ] ``` 这段代码指定了一个库路径,使得链接器在链接时能够找到指定目录下的库文件。 5. **编译选项**: - 可以通过预定义宏定义来设置编译选项,例如优化级别、警告级别等。例如: ```gn cflags += [ "-O2", "-Wall" ] ``` 这段代码设置了编译器的优化级别为 `-O2`,并且启用了所有警告。 通过这些预定义宏定义,可以灵活地控制构建过程,使得代码在不同环境下能够正确编译运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值