【SEU程序设计课笔记】 21 - 2020/12/24 - Write C++ programs - 模板/宏定义

本文探讨了C++中的模板和宏定义,建议使用constexpr和inline函数替代某些宏定义,以减少潜在的错误。举例说明了宏定义在矩阵遍历和求和操作中的应用,并警告了宏定义可能导致的顺序执行问题。同时,推荐使用更安全的编程实践来提高代码质量。
摘要由CSDN通过智能技术生成

模板

详见我的博客 【笔记】 C++ 模板(template)

宏定义

Example 1

#define PI 3.1415926535

现在的 Visual Studio 提示可以用 constexpr double PI = 3.1415926535; 来代替。

Example 2

#define me (*this)

Example 3(多行的define
(功能,遍历矩阵所有元素)

#define enumMatrix(m, p) \
    for(int __y__ = 0; __y__ < m.GetRowCount(); ++__y__) \
    { \
        for (int __x__ = 0; __x__ < m.GetCilCount(); ++__x__) \
        { \
             auto& p = m[__y__][__x__]; 
#define enumMatrixEnd }}

(做求和的一个例子:)

Matrix<double> m; // 定义的矩阵类(二维数组或者vector<vector<T>>也可以)
double sum = 0;
enumMatrix(m, p)
{
	sum += p;
}
enumMatrixEnd;
  • 注意反斜杠后不要有空格。
  • 现在的 Visual Studio 提示可以用 inline function 代替。

Warning

慎用宏定义!牢记宏定义只是字面替换!!!下面举一个典型的错误示例:

#define add(a, b) a + b

/* do something */

int c = add(a, b) * 3;

此时该式实际表示:

int c = a + b * 3;

所以括号一定要加好。

如果用 inline 函数的写法:

inline int add(a, b) // if you are not sure of the type, you can use the tmplate
{
	return a + b;
}

/* do something */

int c = add(a, b) * 3;

这样的函数虽然也是替换,不过不完全是字面替换,是保证先后率的;与一般函数的区别在于这并没有分配新的内存进行计算,而是在原来的地方加上这些运算。


ALL RIGHTS RESERVED © 2020 Teddy van Jerry
欢迎转载,转载请注明出处。


See also

Teddy van Jerry 的导航页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值