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学习的更多相关文章

  1. gcc #define 学习记录

    //test.c #include <stdio.h> #include <stdlib.h> //字符串化运算符 #define EXPAND(name) ({ \ prin ...

  2. #define中 #与##的神奇用法linux学习 (转)

    #define中 #与##的神奇用法linux学习 (转) #define f(a,b) a##b #define d(a) #a #define s(a) d(a) void main( void ...

  3. C++学习之路(一):const与define,结构体对齐,new/delete

    前言:针对C++ Primer和Effective C++两本书,以及技术博客与实验测试,本系列主要是针对C++进行系统化学习,记录学习中遇到的问题和经验. (一)const与define 关于con ...

  4. Extjs 学习总结-Ext.define自定义类

    本教程整理了extjs的一些基本概念及其使用,包括自定义类(Ext.define).数据模型.代理等.本节介绍使用Ext.define自定义类 使用Ext.define自定义类 1. 首先看看js中自 ...

  5. ExtJs 学习之开篇(-)之define

    Ext.onReady(function(){    /**     * test1,声明一个类,定义类中的方法     */ Ext.define("demo.Demo",{   ...

  6. Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define

    尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义 ...

  7. [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过期网上 ...

  8. iOS学习——#define、const、typedef的区别

    在iOS开发中经常遇到一些字段和类型的定义,例如配置生产和测试不同环境的参数等,这时候经常用到#define.const以及typedef.那么它们之间有什么区别呢?我们接下来一个一个具体了解下. 一 ...

  9. Effective C++学习笔记之#define

    前言 条款02:尽量以const.enum.inline替换#define:尽可能用编译器代替不必要的预处理器. 内容 一.对于单纯常量 1.const 有两种特殊的const,常量指针和class专 ...

随机推荐

  1. docker镜像加速遇见的一个问题

    今天运行docker发现了一个问题,运行docker images会报 Cannot connect to the Docker daemon at unix:///var/run/docker.so ...

  2. 小程序setdata json数据的方法

    有如下几种数据格式: sort_condition: { curIndex: ', curArrow: ' } ,//排序界面 date_condition: [ { curIndex: ', cur ...

  3. xcodebuild自动打包上传到蒲公英的shell脚本

    注意: ExportOptions.plist (包含了证书相关信息) 该plist 文件可以通过xcode手动导出ipa之后获取到, 区分appstore 和 development的情况 #! / ...

  4. python自带的split VS numpy中的split比较

    Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串 str1.split() 里面的参数,可以是空格,逗号,字符串啥的,具体应用与 ...

  5. C# 获取微信小程序access_token

    /// <summary> /// 获取access_token /// </summary> /// <returns></returns> publ ...

  6. matploylib之热力图

    刚学我也不熟,做个笔记吧 # coding:utf-8 import numpy as np import matplotlib.pyplot as plt dx = 0.01 dy = 0.01 # ...

  7. C# .NET 和.NET Framework区别

    一,C#简介 1>C#是一种面向对象的.运行于.NET Framework之上的高级程序设计语言. 2>C# 是一种简洁.类型安全的面向对象的语言,开发人员可以使用它来构建在 .NET F ...

  8. mybatis 自定义查询语句

    通过mybatis插件生成的mapper文件只有基本的增.删.改.查.汇总.但是实际使用场景中,总是有各种需要连表.汇总.分组查询的需求,那我们一般都通过自定义查询语句去实现. 有时候会有表结构更改的 ...

  9. vue框架中什么是MVVM

    前端页面中使用MVVM的思想,即MVVM是整个视图层view的概念,属于视图层的概念. MVVM是前端视图层的分层开发思想,将页面分成了Model, View,和VM:其中VM是核心,因为VM是V和M ...

  10. C语言集成开发环境使用小记

    时隔6年,我又重操C语言,是什么让我如此再下定决心?就是不想让自己所学过的知识就此荒废了,我重新以一个C语言初学者的身份(当然,稍稍有点基础,以前的知识忘得没这么快^_^)温故C语言,学习了几天,果真 ...