您好,登錄后才能下訂單哦!
本篇內容主要講解“C++為什么不要使用宏進行程序中的文本操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++為什么不要使用宏進行程序中的文本操作”吧!
ES.30: 不要使用宏進行程序中的文本操作
宏是錯誤的主要來源之一。宏不會遵守通常的范圍和類型準則。宏可以為人提供一個和編譯器視角有些不同的視角。宏讓工具構建變得更復雜。
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++為什么不要使用宏進行程序中的文本操作”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。