#define学习
C语言中数据有常量和变量,其中定义常量主要有两种方法,这里主要学习#define定义常量的方法。
1.#define定义数字宏常量
例子如下:
1
2
3
4
5
6
7
8
9
10
|
#include<stdio.h> #define PI 3.14 int main( void ) { printf ( "%d\n" ,PI); printf ( "%f\n" ,PI); return 0; } |
以上例子通过#define定义了常量PI,其值为3.14。其值为float单浮点数,但是#define定义时没有声明基本数据类型,而是直接定义了一个常量字符来表示此数值。
#define没有显示的声明基本数据类型,因此在使用此方法定义常量时需要程序员清楚常量符号表示的数据是哪一种类型,否则会引起错误。
比如上面例子中PI是单浮点数,通过两种不同的数据类型进行打印,打印的结果如下:
$ ./define.exe
1374389535
3.140000
从结果看差异很大,因此在使用#define常量符号时,需要自判定数据的类型。
2.#define定义字符串宏常量
#define CITY "WuHan"
这是最简单的字符串宏常量,中间没有任何的转义字符或特殊字符。
#define PATH "E:\\c_study"
这是比较复杂的字符串宏常量,比如路径等,这里需要是双斜杠,否则会报如下错误:
$ gcc define.c -o define
define.c: 在函数‘main’中:
define.c:10:16: 警告:未知的转义序列:‘\c’
printf("%s\n",PATH);
^
即\需要配合转义字符使用。
例子代码如下:

#include<stdio.h> #define PI 3.14
#define CITY "WuHan"
#define PATH "E:\\c_study" int main(void)
{
printf("%s\n",CITY);
printf("%s\n",PATH);
return 0;
}

输出结果为:
$ ./define.exe
WuHan
E:\c_study
3.#define定义函数宏常量
函数宏常量涉及到函数换行,换行=\+回车
例子:

#include<stdio.h> #define dump(name)\
{\
printf(name); \
printf("\n"); \
printf(name); \
printf("\n"); \
} int main(void)
{
dump("test0");
dump("test1");
return 0;
}

运行结果:
$ ./define
test0
test0
test1
test1
即#define定义时,换行不是以;判定,而是以"/+回车"判定
4.#undef 用来撤销宏常量的定义,撤销后不存在此宏常量
总结:
#define可以定义多种类型的宏常量,需要结合不同的场景使用,每一种场景需要注意对应的数据类型,转义字符和换行等关键地方。
#define学习的更多相关文章
- gcc #define 学习记录
//test.c #include <stdio.h> #include <stdlib.h> //字符串化运算符 #define EXPAND(name) ({ \ prin ...
- #define中 #与##的神奇用法linux学习 (转)
#define中 #与##的神奇用法linux学习 (转) #define f(a,b) a##b #define d(a) #a #define s(a) d(a) void main( void ...
- C++学习之路(一):const与define,结构体对齐,new/delete
前言:针对C++ Primer和Effective C++两本书,以及技术博客与实验测试,本系列主要是针对C++进行系统化学习,记录学习中遇到的问题和经验. (一)const与define 关于con ...
- Extjs 学习总结-Ext.define自定义类
本教程整理了extjs的一些基本概念及其使用,包括自定义类(Ext.define).数据模型.代理等.本节介绍使用Ext.define自定义类 使用Ext.define自定义类 1. 首先看看js中自 ...
- ExtJs 学习之开篇(-)之define
Ext.onReady(function(){ /** * test1,声明一个类,定义类中的方法 */ Ext.define("demo.Demo",{ ...
- Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define
尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义 ...
- [Cocos2d-x学习笔记]Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawk解决方案
Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawkawk过期网上 ...
- iOS学习——#define、const、typedef的区别
在iOS开发中经常遇到一些字段和类型的定义,例如配置生产和测试不同环境的参数等,这时候经常用到#define.const以及typedef.那么它们之间有什么区别呢?我们接下来一个一个具体了解下. 一 ...
- Effective C++学习笔记之#define
前言 条款02:尽量以const.enum.inline替换#define:尽可能用编译器代替不必要的预处理器. 内容 一.对于单纯常量 1.const 有两种特殊的const,常量指针和class专 ...
随机推荐
- Java牛角尖【007】:Java中的Error能不能被Catch
Java牛角尖[007]:Java中的Error能不能被Catch 网上看到很多朋友说Java中Error是无法Catch到的,而Java中定义的Error类型又很难测试到,那就估且以为确是如此吧 ...
- laravel 向多视图及所有视图传递数据变量
向单个视图传递变量 1.使用with()方法 : view('user.lists')->with('title',$title); 2.直接view()传参: view('user.lists ...
- Prometheus 安装与配置
下载Prometheus https://prometheus.io/download/ wget https://github.com/prometheus/prometheus/releases/ ...
- upc组队赛15 Lattice's basics in digital electronics【模拟】
Lattice's basics in digital electronics 题目链接 题目描述 LATTICE is learning Digital Electronic Technology. ...
- POI解析读写EXCEL,复制SHEET,兼容EXCEL93-2003,2007
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apa ...
- HDU 1709 The Balance( DP )
The Balance Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 如何用Mybatis分库分表
分库 在分库的时候 有时候为了方便 一些表需要存放所有库的信息,称为全局库.如:用户表存放所有的用户. 此时分库的思路 数据库分为全局库和业务库,其中业务库又分为N多个库,全局库只放个别表方便开发. ...
- 45.Sort List(链表排序)
Level: Medium 题目描述: Sort a linked list in O(n log n) time using constant space complexity. Example ...
- 36.Minimum Path Sum(最小路径和)
Level: Medium 题目描述: Given a m x n grid filled with non-negative numbers, find a path from top left ...
- SpringMVC学习(11):表单标签
本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...