溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++為什么不要使用宏進(jìn)行程序中的文本操作?

發(fā)布時(shí)間:2021-11-26 14:36:56 來源:億速云 閱讀:158 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++為什么不要使用宏進(jìn)行程序中的文本操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++為什么不要使用宏進(jìn)行程序中的文本操作”吧!

ES.30: 不要使用宏進(jìn)行程序中的文本操作

Reason(原因)

宏是錯(cuò)誤的主要來源之一。宏不會(huì)遵守通常的范圍和類型準(zhǔn)則。宏可以為人提供一個(gè)和編譯器視角有些不同的視角。宏讓工具構(gòu)建變得更復(fù)雜。

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.

這個(gè)看起來無害的宏在將大寫C替換為小寫c時(shí)引入了程序流控制錯(cuò)誤。

Note(注意)

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

本準(zhǔn)則沒有禁止使用宏(如#ifdef等)進(jìn)行配置控制。

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

將來,模塊功能應(yīng)該可以消除宏在配置控制方面的用途。

Note(注意)

本規(guī)則也不鼓勵(lì)使用#和##進(jìn)行字符串的轉(zhuǎn)換和鏈接。一般來講,很多情況下使用宏都是基本無害的,但是即使是這樣也會(huì)為工具帶來困難,例如有些自動(dòng)補(bǔ)全軟件,靜態(tài)分析軟件和調(diào)試器等。通常使用花哨的宏定義是過于復(fù)雜的設(shè)計(jì)的信號(hào)。#和##也會(huì)鼓勵(lì)宏的定義和使用。

#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:

確實(shí)存在需要使用宏定義進(jìn)行底層字符串操作時(shí)可以使用一些變通,例如:

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.

將來,靜態(tài)反射機(jī)制應(yīng)該可以消除在程序中處理文本時(shí)使用預(yù)處理器的最后一個(gè)需求。

Enforcement(實(shí)施建議)

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

當(dāng)給你看到宏定義不是用于代碼控制(例如#ifdef)時(shí),一定要尖叫。

到此,相信大家對(duì)“C++為什么不要使用宏進(jìn)行程序中的文本操作”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI