C++为什么不要使用宏进行程序中的文本操作​

发布时间:2021-11-26 14:36:56 作者:iii
来源:亿速云 阅读:152

本篇内容主要讲解“C++为什么不要使用宏进行程序中的文本操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++为什么不要使用宏进行程序中的文本操作”吧!

ES.30: 不要使用宏进行程序中的文本操作

Reason(原因)

宏是错误的主要来源之一。宏不会遵守通常的范围和类型准则。宏可以为人提供一个和编译器视角有些不同的视角。宏让工具构建变得更复杂。

Example, bad(反面示例)

#define Case break; case   /* BAD */

This innocuous-looking macro makes a single lower case c instead of a C into a bad flow-control bug.

这个看起来无害的宏在将大写C替换为小写c时引入了程序流控制错误。

Note(注意)

This rule does not ban the use of macros for "configuration control" use in #ifdefs, etc.

本准则没有禁止使用宏(如#ifdef等)进行配置控制。

In the future, modules are likely to eliminate the need for macros in configuration control.

将来,模块功能应该可以消除宏在配置控制方面的用途。

Note(注意)

本规则也不鼓励使用#和##进行字符串的转换和链接。一般来讲,很多情况下使用宏都是基本无害的,但是即使是这样也会为工具带来困难,例如有些自动补全软件,静态分析软件和调试器等。通常使用花哨的宏定义是过于复杂的设计的信号。#和##也会鼓励宏的定义和使用。

#define CAT(a, b) a ## b
#define STRINGIFY(a) #a

void f(int x, int y)
{
   string CAT(x, y) = "asdf";   // BAD: hard for tools to handle (and ugly)
   string sx2 = STRINGIFY(x);
   // ...
}

There are workarounds for low-level string manipulation using macros. For example:

确实存在需要使用宏定义进行底层字符串操作时可以使用一些变通,例如:

string s = "asdf" "lkjh";   // ordinary string literal concatenation

enum E { a, b };

template<int x>
constexpr const char* stringify()
{
   switch (x) {
   case a: return "a";
   case b: return "b";
   }
}

void f(int x, int y)
{
   string sx = stringify<x>();
   // ...
}

This is not as convenient as a macro to define, but as easy to use, has zero overhead, and is typed and scoped.

这段代码不像定义宏那么容易,但同样方便使用,不存在额外的开销,并且包含类型和范围。

In the future, static reflection is likely to eliminate the last needs for the preprocessor for program text manipulation.

将来,静态反射机制应该可以消除在程序中处理文本时使用预处理器的最后一个需求。

Enforcement(实施建议)

Scream when you see a macro that isn't just used for source control (e.g., #ifdef)

当给你看到宏定义不是用于代码控制(例如#ifdef)时,一定要尖叫。

到此,相信大家对“C++为什么不要使用宏进行程序中的文本操作”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. C++宏的高级用法
  2. 如何使用vim中的宏进行批量操作

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:debian如何安装mysql

下一篇:C#如何实现基于Socket套接字的网络通信封装

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》