`
qepwqnp
  • 浏览: 118090 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

像定义“函数”一样定义宏

阅读更多

可以使用宏定义没有返回值的“函数”。例如:

#define PrintMax(a, b) \
    do \
    { \
        int x = a, y = b; \
        printf("Max: %d\n", x > y ? x : y);\
    } while (0)

// ...
PrintMax(3, 4);

这样的“函数”与真正意义上的函数有本质的区别,因为宏是一个编译前行为,仅仅是编译前对文本进行替换。在Python源码中,经常可以看到下面类似的宏定义:

#define foo(x) \
    do { \
        ... \
    } while (0)

为什么要使用do { ... } while (0)这样的语法而不直接使用 { } 呢?定义了上面这个宏,我们就可以在代码中使用类似这样的代码:foo(3); 注意结尾的分号,它看起来很像一个函数,实现上它表示一条语句。如果使用 { } 来代替 do { ... } while (0),那么使用分号显然是个语法错误。

使用宏时,有几点要特别注意:

  • 要特别留心空格。下面的两个宏是一样的:
#define foo(x) (x << 2)
#define boo (x) (x << 2)  //注意括号前面的空格
  • 用宏给类型取别名与typedef有很大的区别。例如:
#define INT int *
INT p1, p2; // p1是指针,p2是一个int变量

typedef  int * INT;
INT p1, p2; // p1, p2都为指针

//---------------------------------------------------

#define LONG long
unsigned LONG v1;  // v1是一个无符号的long变量

typedef long LONG;
unsigned LONG v1; // 错误哦~~~
分享到:
评论

相关推荐

    宏定义和函数调用的区别

    在探讨宏定义与函数调用的区别时,我们深入解析它们在C语言编程中的特性、应用场景以及潜在风险,以便更全面地理解这两种编程机制。 ### 宏定义与函数调用的本质区别 #### 宏定义(#define) 宏定义是预处理器的一...

    函数模板与宏定义

    在编程领域,函数模板和宏定义是两种常见的代码复用技术,它们都能帮助开发者提高代码的效率和可维护性。本文将深入探讨这两种方法的原理、优缺点以及使用场景。 函数模板是C++中的一项重要特性,它允许我们创建...

    宏(#define)定义函数妙用

    在“宏#define定义函数妙用”这个主题中,我们主要探讨如何巧妙地利用宏定义来模拟函数,以及在实际编程中的一些应用场景。 首先,宏定义可以创建常量,比如定义`NULL`,在C/C++中通常用来表示空指针。`#define ...

    C语言宏定义和宏定义函数

    C语言宏定义和宏定义函数 C语言宏定义是C语言编程中非常重要的一部分,它可以帮助我们防止出错,提高代码的可移植性和可读性等。宏定义可以封装一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以...

    Source Insight 自定义宏函数

    自己编写的SourceInsight宏函数(增加了很多实用的功能,欢饮交流指正^_^) ... HowToUseMacroFunction 本文所定义宏函数使用说明 ******************************************************************************

    printf函数的原型和重定义

    printf 函数的原型和重定义 printf 函数是 C 语言中一个常用的输出函数,它可以将格式化的字符串输出到标准输出设备上。在嵌入式开发领域中,printf 函数经常被重定义以满足特定的需求。本文将详细介绍 printf ...

    sourceInsight宏定义

    你可以定义一个宏,比如名为`ToggleComment`,其中命令部分使用`CommentLine()`和`UncommentLine()`函数。当你按下设置的快捷键时,Source Insight将自动对当前选中的代码行进行注释或取消注释。 3. **宏命令** - ...

    浅谈内联函数与宏定义的区别详解

    文章(一)内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如: #define MAX(a,b) ((a)&gt;(b)?(a):(b)) 该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)&gt;(b)?...

    C 语言函数宏封装妙招C 语言函数宏封装妙招 1. 函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的

    函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。 函数宏本质上为宏,可以直接进行定义,例如: 复制 #define INT_SWAP(a,b) \ int ...

    C语言中的宏定义与内联函数:深入理解与实践

    宏定义和内联函数都可以用来提高代码的执行效率,但它们在实现方式和使用场景上有所不同。宏定义在预处理阶段进行文本替换,不进行类型检查,而内联函数在编译时进行类型检查。宏定义适用于简单的代码替换,而内联...

    MFC 宏定义详解 MFC 宏定义详解

    宏定义在MFC中扮演着重要的角色,它们提供了代码复用、简化编程、以及在编译时进行条件检查等能力。本文将深入探讨MFC中的宏定义,帮助开发者更好地理解和利用这些工具。 首先,我们来看MFC中的类宏。MFC中有很多...

    MFC宏定义详解讲述宏的定义

    - **成员函数宏**:例如`DECLARE_MESSAGE_MAP`用于定义消息映射,`ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnBnClickedButton1)`用于将消息与处理函数关联。 - **对象创建宏**:如`new`操作符常常被`AfxNewObject`...

    c++ 宏函数定义 例子 vs2012

    这样的函数在编译时也可以进行优化,而且不会引发宏定义的一些问题。 总的来说,理解C++的宏定义及其使用方式对于任何C++开发者来说都是必要的,但同时也应该意识到它们的潜在风险,并尽可能地使用更安全的语言特性...

    c/c++宏定义 宏定义的入门教材 基础

    使用宏定义`SQUARE`与定义函数`square`相比,宏定义没有类型检查,而且在宏展开时可能会引入副作用。例如: ```c int i = 1; while (i ) { printf("%d\n", SQUARE(i++)); } ``` 上面这段代码可能不会按照...

    函数式宏定义与普通函数的区别

    若字符串是表达式,我们称之为函数式宏定义,那函数式宏定义与普通函数有什么区别呢?我们以下面两行代码为例,展开描述:函数式宏定义:#define MAX(a,b) ((a)&gt;(b)?(a):(b))普通函数 :MAX(a,b) { return a&gt;b?a:b;}...

    C语言中的内联函数(inline)与宏定义(#define)详细解析

    内联函数的一个重要优势是它们像普通函数一样被处理,支持类型检查和作用域规则,避免了宏定义可能出现的副作用和多次计算问题。例如,宏定义可能会导致意外的副作用,如下所示: ```c #define unsafe(i) ((i) &gt;= 0...

    宏定义引用

    宏定义是C语言中的一种预处理指令,主要用于简化程序编写过程中的某些操作,例如定义常量、函数等。通过宏定义可以将一些常用的表达式或代码段进行封装,以便于在程序中多次调用。 #### 2. 宏定义的基本语法 宏定义...

    C++宏定义说明(详解)

    4. 在某些情况下,为了提高程序执行效率,可以将函数定义转换为宏定义,但要注意这可能会带来维护上的问题。 #### 三、宏定义的最佳实践 虽然宏定义提供了强大的功能,但在实际编程中也需要谨慎使用。以下是一些...

    常用宏定义#define

    在C/C++编程语言中,`#define` 是预处理器指令,用于创建宏定义,它在...因此,在使用宏定义时,需谨慎处理,尤其是在处理复杂表达式和函数宏时,应尽量考虑使用inline函数或者C++11引入的 constexpr 关键字来替代。

Global site tag (gtag.js) - Google Analytics