C语言简单编译预处理-笔记
预处理指令
所谓预处理,是指,在编译之前对程序源码进行初步的转换,产生新的源代码提供给编译器.预处理时主要完成:包含其他源文件,定义宏,根据条件决定编译时是否包含某些代码(>防止重复包含某些文件)
1.#空指令,无效果
2.#include 包含一个源代码文件
3.#define 定义宏
4.#undef 取消已经定义的宏
5.#if 如果给定的条件为真,则编译下面代码
6.#ifdef 如果宏已经定义,则编译下面代码
7.#ifndef 如果宏没有定义,则编译下面代码
8.#elif 如果前文的#if给定条件不为真,当前条件为真,则编译下面代码
9.#endif 结束一个#if ... #elif条件编译块
10.#error 停止编译并显示错误信
extern关键字
基本解释为:
extern放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.
两个作用
1.当它与"C"一起连用时,如:extern "C" void find(int k); 告诉编译器在编译fun这个函数时,按照C语言的规则来翻译,因为C++支持函数重载,函数名翻译规则与C语言不同.
2.单独使用时, 如: extern void find(int k); 它的作用就是__声明__全局变量或函数作用范围的关键字其声明的函数和变量可以在本模块或其他模块中使用.
#ifdef __cplusplus
#ifdef __cplusplus
extern "C" {
#endif
//代码
#ifdef __cplusplus
}
#endif
首先, __cplusplus
是C++中自定义的宏,定义了这个宏,就代表是这是一段C++代码
结合上面提到的extern "C"
来说,这段代码的含义是:如果这是一段C++的代码,那么加入extern "C"{
和}
之前的代码按照C语言的规则来编译.
在调试代码中也可以加入
#ifdef DEBUG
//调试代码。调试用到的find函数
#else
// 发行版find函数
#endif
只用在编译时gcc -DDEBUG -o target target.c
程序即可调用调试代码,去掉-DDEBUG
即可生成发行版
C语言简单编译预处理-笔记的更多相关文章
- C语言进阶——编译预处理指令
编译预处理指令 • #开头的是编译预处理指令 • 它们不是C语⾔的成分,但是C语⾔程序离不开它们 • #define⽤来定义⼀个宏 #define • #define <名字> <值 ...
- Verilog学习笔记基本语法篇(十二)········ 编译预处理
h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...
- c语言编译预处理和条件编译执行过程的理解
在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令.预处理命令属于C语言编译器,而不是C语言的组成部分.通过预处理命令可扩展C语言程序设计的环境. 一.预处理的工作方式 1.1. ...
- C语言条件编译及编译预处理阶段(转)
一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的 ...
- 【转】C语言条件编译及编译预处理阶段
原文: http://www.cnblogs.com/rusty/archive/2011/03/27/1996806.html 1. 宏定义(宏代换,宏替换,宏: 宏定义是C语言提供的3中预处理功能 ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- C语言深度解剖读书笔记
开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...
- 【转】 C语言深度解剖读书笔记(1.关键字的秘密)
本文出处:http://blog.csdn.net/mbh_1991/article/details/10149805 开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有 ...
- C语言模块化编译介绍
C语言模块化编译介绍 模块化编程的概念 所谓模块化变成(多文件开发),就是多文件(.c文件)编程,一个.c文件和一个.h文件可以被称为一个模块. 头文件开发的注意事项: 1)头文件中可以和C程序一样引 ...
随机推荐
- File流与IO流 看这一篇就够了
主要内容 File类 递归 IO流 字节流 字符流 异常处理 Properties 缓冲流 转换流 序列化流 打印流 学习目标 [ ] 能够说出File对象的创建方式 [ ] 能够说出File类获取名 ...
- 乌班图14更新软件提示错误:https://mirrors.aliyun.com kubernetes-xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 6A030B21BA07F4FB
提示如下 获取: https://mirrors.aliyun.com kubernetes-xenial InRelease 忽略 https://mirrors.aliyun.com kubern ...
- bjut校园网自动登录
主要是懒得每次上网都需要打开网页=.= logon.bat @echo off mode con: cols=40 lines=15 color 0a title 登录ing... rem 获得IP ...
- Notepad++ Plugin Manager更新插件出错
作为墙内人士,更新个插件都TMD浪费很长时间! 解决方案: 定位文件notepaid++\updater\GUP.exe What is WinGup? --------------- WinGup ...
- NLP新秀 - Bert
目录 什么是Bert Bert能干什么? Bert和TensorFlow的关系 BERT的原理 Bert相关工具和服务 Bert的局限性和对应的解决方案 沉舟侧畔千帆过, 病树前头万木春. 今天介绍的 ...
- POJ_2479_DP
http://poj.org/problem?id=2479 从前向后保存起点到每一点的最长串,从后向前保存尾点到每一点的最长串. 然后枚举中断点,找前后和最大值就行了. #include<io ...
- Java 代码实现链表
Linked List 用多少就申请多少内存. 链表是一种链式存储的线性表,所有元素的内存地址不一定连续的. 接口设计 代码实现 MyList.java(接口) package com.cyb; pu ...
- JFrame的getContentPane
我们可以在 JFrame 对象中添加 AWT 或者 Swing 组件.但是,虽然它有 add 方法,却不能直接用于添加组件,否则会抛出异常.造成这个现象的原因只有一个解释:JFrame 不是一个容器, ...
- qt creator源码全方面分析(2-10-3)
目录 Plugin Meta Data 主键 插件描述键 依赖 可选依赖项 测试依赖项 命令行参数 Test.json示例 插件版本说明 Plugin Meta Data 插件的元数据文件是一个JSO ...
- java 自学简单框架(反射+注解)
1.先定义一个学生类 2.再定义一个teacher类(这个是为了练习多个注解,自己练习可以 不写这个) 3.再定义个一个学生老师类(这个是为了最终调用上面的那个学生类做准备) 4.下面开始真正的写框架 ...