C语言中#define的用法(转)

转自:http://www.dingge.com/main/article.asp?id=10

今天整理了一些#define的用法,与大家共享!

1.简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i<MAXTIME){.........}

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

2.define的“函数定义”

define可以像函数那样接受一些参数,如下

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

但是这样做的话存在隐患,例子如下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
c*a + b*d

另外举一个例子:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。

所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

3.宏的单行定义

#define A(x) T_##x
#define B(x) #@x
#define C(x) #x

我们假设:x=1,则有:

A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"

(这里参考了 hustli的文章)

3.define的多行定义

define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

#define MACRO(arg1, arg2) do { /
/* declarations */ /
stmt1; /
stmt2; /
/* ... */ /
while(0)
 /* (no trailing ; ) */
关键是要在每一个换行的时候加上一个"/"

摘抄自http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修补了几个bug

[

例如:

#define PRINT_ERR(ret) do{\switch(ret)\{\case 1:\return -1;\case 2:\return -2;\default :\return -3;\}\}while(0)这是正确的,注意,行跟行之间要紧接,不能有空行(如果有空行,该行也需要有续行符)。
do{}while(0)是宏定义里一个不错的用法

]

4.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

就是:
#ifdef WINDOWS
......
......
#endif
#ifdef Linux
......
......
#endif

可以在编译的时候通过#define设置编译环境

5.如何定义宏、取消宏

//定义宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
//普通宏
#define PI (3.1415926)

带参数的宏
#define max(a,b) ((a)>(b)? (a),(b))
关键是十分容易产生错误,包括机器和人理解上的差异等等。

6.条件编译
#ifdef XXX…(#else) … #endif
例如
#ifdef DV22_AUX_INPUT
#define AUX_MODE 3 
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif

7.头文件(.h)可以被头文件或C文件包含;
重复包含(重复定义)
由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

//文件内容

#endif

以上只是我从网络上搜集了一些关于define的一些用法,可能还不全面,而且#define的使用本来也存在这争议,如果你对#define的用法也很有兴趣,可以来参加我们的讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cocoa pods的安装与我遇到的问题

1.打开终端 终端输入 ruby -v 查看ruby的版本 打印代码&#xff1a; ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15] 2. 更换ruby镜像 终端输入如下命令&#xff08;把Ruby镜像指向taobao&#xff0c;避免被墙&#xff0c;你懂得&#xff09; a.移…

Node 连接Mysql并进行增删改查

NPM: NPM的全称是Node Package Manager&#xff0c;类似于ruby的gem&#xff0c;Python的PyPL、setuptools&#xff0c;PHP的pear&#xff0c;是Nodejs中的包管理器。Nodejs自身提供了基本的模块。但是在这些基本模块上开发实际应用需要较多的工作。NPM上已经有近万个Nodejs库或…

C++/C 宏定义(define)中# ## 的含义(转)

参考&#xff1a;http://www.cnblogs.com/little-ant/p/3463080.html http://hi.baidu.com/kiraversace/item/1148ee057147981a4ac4a3e9 C/C 宏定义&#xff08;define&#xff09;中# ## 的含义 define 中的# ## 一般是用来拼接字符串的&#xff0c;但是实际使用过程中&#x…

Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99

一般出现该问题是因为通过C调用了unix/linux 底层接口&#xff0c;所以需要调整c语言的编译选项&#xff0c;设置方法见下图&#xff1a;(根据实际情况选择相应的编译选项)

C++里的花括号{},块,作用域

{ } 里的内容是一个“块”。单独的{ }在执行顺序上没有改变&#xff0c;仍然是顺序执行&#xff0c;不同的是标识符的作用域限定 。#include <iostream>#include <string>using namespace std;class tcalss{string Name;public:tcalss(string name){Namename;cout&…

iOS关于armv7,armv7s,arm64,i386,x86_64等问题

iOS测试分为模拟器测试和真机测试&#xff0c;处理器分为32位处理器&#xff0c;和64位处理器&#xff0c; 模拟器32位处理器测试需要i386架构&#xff0c;&#xff08;iphone5,iphone5s以下的模拟器&#xff09; 模拟器64位处理器测试需要x86_64架构&#xff0c;(iphone6以上的…

DebugView 调试入门

参考链接&#xff1a;http://blog.csdn.net/jiankunking/article/details/44984487 软件下载地址&#xff1a;点击打开链接 debugview 可以捕获程序中由TRACE(debug版本)和OutputDebugString输出的信息。支持Debug、Release模式编译的程序&#xff08;即该软件捕获的是exe直接运…

AJAX只支持字符类数据返回,不支持文件下载

如题转载于:https://www.cnblogs.com/caicaizi/p/5000363.html

Xcode中指令集相关选项

Xcode中指令集相关选项&#xff08;Build Setting中&#xff09; &#xff08;1&#xff09;Architectures Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies…

DebugView使用笔记

1. 什么是DebugView? 它是Sysinternals公司的系列调试工具。可以捕获程序中由TRACE()和OutputDebugString输出的信息。 2. C需要完成哪些工作呢&#xff1f; 将打印的信息用OutputDebugString输出&#xff0c;示例&#xff1a; [cpp] view plaincopy #include "stdio.h&q…

DebugView的使用[通用汇总]

DebugView是一款免费辅助工具&#xff0c;用来输出捕捉OutputDebugString()函数输出的信息等。 1 下载 http://technet.microsoft.com/en-us/sysinternals/bb896647 1.1 介绍DebugView http://www.vcfans.com/2008/11/trace-show-about-a-tool-debugview-sent-a-message-to-tra…

Android 通信 EventBus

参考&#xff1a; Android 框架炼成 教你如何写组件间通信框架EventBusAndroid EventBus源码解析 带你深入理解EventBusAndroid EventBus实战 没听过你就out了快速Android开发系列通信篇之EventBusEventBus是一个publish/subscribe (发布 / 订阅) 消息的总线&#xff0c;简化了…

WIFI无线路由器的五种工作模式

http://www.360doc.com/content/12/0814/08/10560798_230064460.shtml

iOS面试题1

而技术开发面试&#xff0c;问一些技术相关的问题是必须的&#xff0c;最新的技术可能人人都趋之若鹜&#xff0c;但有些原理和基础的也希望都有了解。 这里整理了一些iOS相关的面试题&#xff0c;&#xff08;可能都已经老掉牙&#xff09;但是也想跟大家分享下&#xff01; 如…

高质量JAVA代码编写规范

1. Java 命名约定   除了以下几个特例之外&#xff0c;命名时应始终采用完整的英文描述符。此外&#xff0c;一般应采用小写字母&#xff0c;但类名、接口名以及任何非初始单词的第一个字母要大写。 1.1 一般概念   * 尽量使用完整的英文描述符   * 采用适用于相关领域的…

MFC中绘制动态曲线

参考&#xff1a; http://blog.csdn.net/zang141588761/article/details/50536788 [转载]MFC中画直线和曲线 一、画直线要想在MFC中画出有颜色的线条&#xff0c;首先就要设置DC的画笔&#xff0c;我们可以按如下方法来设置画笔&#xff1a;第一步&#xff1a;在View类中添加…

博客地址 RSS地址

博客地址 RSS地址 OneVs Den http://onevcat.com/atom.xml 破船之家 http://beyondvincent.com/atom.xml NSHipster http://nshipster.cn/feed.xml Limboy 无网不剩 http://feeds.feedburner.com/lzyy 唐巧的技术博客 http://blog.devtang.com/atom.xml Lex iOS notes http://i…

2015.11.27---Java

public class star{public static void main(String[] args) {System.out.print("ha");}}转载于:https://www.cnblogs.com/supermeimei/p/5001922.html

QT之深入理解QThread

QT之深入理解QThread 理解QThread之前需要了解下QThread类&#xff0c;QThread拥有的资源如下&#xff08;摘录于QT 5.1 帮助文档&#xff09;&#xff1a;在以上资源中&#xff0c;本文重点关注槽&#xff1a;start()&#xff1b;信号&#xff1a;started()、finished()&#…

常见人事问题

整体素养的常见问题 一、请你自我介绍一下你自己&#xff1f; &#xff08;面试官目的&#xff1a;深度了解求职者&#xff0c;看求职者基本的沟通和自我认知能力&#xff09; NO: 只说姓名、年龄、爱好等基本的信息后就没了。只重复简历里的内容&#xff0c;如工作经验就…