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

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

在靜海等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需求定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),靜海網(wǎng)站建設(shè)費(fèi)用合理。

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

Reason(原因)

宏是錯(cuò)誤的主要來(lái)源之一。宏不會(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è)看起來(lái)無(wú)害的宏在將大寫C替換為小寫c時(shí)引入了程序流控制錯(cuò)誤。

Note(注意)

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

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

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

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

Note(注意)

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

這段代碼不像定義宏那么容易,但同樣方便使用,不存在額外的開(kāi)銷,并且包含類型和范圍。

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

將來(lái),靜態(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)行程序中的文本操作”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文題目:C++為什么不要使用宏進(jìn)行程序中的文本操作?
轉(zhuǎn)載源于:http://muchs.cn/article24/jehgje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、外貿(mào)網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站設(shè)計(jì)公司企業(yè)建站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管