惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
有赞技术团队
有赞技术团队
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
D
DataBreaches.Net
F
Full Disclosure
腾讯CDC
博客园 - 【当耐特】
MyScale Blog
MyScale Blog
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
The Register - Security
The Register - Security
WordPress大学
WordPress大学
博客园 - 聂微东
雷峰网
雷峰网
J
Java Code Geeks
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
G
Google Developers Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
O
OpenAI News
Project Zero
Project Zero
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
P
Palo Alto Networks Blog
Schneier on Security
Schneier on Security

博客园 - Nillson

传说中的Singleton.... 设计模式--简单工厂模式 策略模式 抽象类与接口 C# 实现的一个二叉树类 回顾一个面试题 再谈代理 常见的排序方法 连接符,数值运算与函数 复杂查询 数据库中的Index和View的理解 重载和重写 采用递归的方法获得一棵树的所有叶节点 .NET中的新概念整理 4月要看的书 System.Runtime.InteropServices浅见 挂个牛人 一篇关于如何写注释的文章,值得收藏 Vistual Studio 2005到Vistual Studio 2008的版本转换问题 Visual Studio 2008 的一个Bug
预定义,宏定义
Nillson · 2008-07-04 · via 博客园 - Nillson

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

宏定义:

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