#define学习
C语言中数据有常量和变量,其中定义常量主要有两种方法,这里主要学习#define定义常量的方法。
1.#define定义数字宏常量
例子如下:
|
1
2
3
4
5
6
7
8
9
10
|
#include<stdio.h>#define PI 3.14int 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专 ...
随机推荐
- 如何在Oracle中建表空间、建用户并导入dmp文件详解
假设oracle有个全新的数据库orcl,现在要把数据库文件(.dmp)导入这个全新的数据库orcl中.详细步骤如下: 1. 创建表空间 例如: create tablespace test ...
- [题解]RGB Substring (hard version)-前缀和(codeforces 1196D2)
题目链接:https://codeforces.com/problemset/problem/1196/D2 题意: q 个询问,每个查询将给你一个由 n 个字符组成的字符串s,每个字符都是 “R”. ...
- js判断一件商品加还是减
<div class="right"> <div onclick="javascript: ClickJian(this);" data-i= ...
- 哈希算法和字典类的定义,DataSet中数据遍历的几种方法
哈希算法的基本操作: 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似 ...
- 百度分布式配置管理平台-Disconf
Disconf介绍 全称:Distributed Configuration Management Platform,即分布式配置管理平台. Disconf专注于各种分布式系统配置管理的通用组件和通用 ...
- 插件化框架解读之so 文件加载机制(四)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 提问 本文的结论是跟着 System.loadlibrary() ...
- 40.Unique Binary Search Trees(不同的二叉搜索树)
Level: Medium 题目描述: Given n, how many structurally unique BST's (binary search trees) that store v ...
- Centos7 安装vscode
1.官网下载vscode https://vscode.cdn.azure.cn/stable/0f3794b38477eea13fb47fbe15a42798e6129338/code-1.36.0 ...
- ubuntu16.04安装docker11.09
1. 安装Docker 操作系统 ubuntu16.04 1.1. 配置源文件 $sudo apt-get update #允许 apt 命令 HTTPS 访问 Docker 源 $sudo ...
- 三次握手和四次挥手以及TCP标志位的详细介绍
一.TCP标志位 在讲TCP三次握手和四次挥手之前,先说一下TCP标志位,方便后续的理解. 简单来说,TCP标志位的值代表了当前请求的目的. 标志位一共有6种,分别是: SYN(synchronous ...