C++中宏的應用成績詳解。本站提示廣大學習愛好者:(C++中宏的應用成績詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中宏的應用成績詳解正文
宏不遵守C++中關於規模和類型的規矩。這常常招致一些奧妙的或不那末奧妙的成績。是以,C++供給更合適其他的C++(譯注:原文為the rest of C++,當指C++除兼容C 之外的部門)的替換品,例如內聯函數、模板與名字空間。
斟酌一下:
#include "someheader.h" struct S { int alpha; int beta; };
假如或人(不明智地)地寫了一個叫“alpha”或“beta”的宏,那末它將不會被編譯,或許被毛病地編譯,發生弗成預知的成果。例如,“someheader.h”能夠包括:
#define alpha 'a' #define beta b[2]
將宏(並且僅僅是宏)全體年夜寫的習氣,會有所贊助,然則關於宏並沒有說話條理上的掩護機制。例如,固然成員的名字包括在構造體的外部,但這杯水車薪:在編譯器可以或許准確地鑒別這一點之前,宏曾經將法式作為一個字符流停止了處置。趁便說一句,這是C 和C++法式開辟情況和對象可以或許被簡化的一個重要緣由:人與編譯器看到的是分歧的器械。
不幸的是,你不克不及假定其余法式員老是可以或許防止這類你以為“相當呆子”的工作。例如,比來有人申報我,他們碰到了一個包括goto 的宏。我也見過這類情形,並且聽到過一些——在很軟弱的時刻——看起來確切有理的看法。例如:
#define prefix get_ready(); int ret__ #define Return(i) ret__=i; do_something(); goto exit #define suffix exit: cleanup(); return ret__ void f(){ prefix; // ... Return(10); // ... Return(x++); //... suffix; }
作為一個保護的法式員,就會發生這類印象;將宏“隱蔽”到一個頭文件中——這其實不罕有——使得這類“魔法”更難以被鑒別。
一個罕見的奧妙成績是,一個函數作風的宏其實不遵照函數參數傳遞的規矩。例如:
#define square(x) (x*x) void f(double d, int i){ square(d); // 好 square(i++); // 蹩腳:這表現 (i++*i++) square(d+1); //蹩腳:這表現(d+1*d+1); 也就是 (d+d+1) // ... }
“d+1”的成績,可以經由過程在“挪用”時或宏界說時添加一對圓括號來處理:
#define square(x) ((x)*(x)) /*如許更好 */
然則, i++被履行了兩次(能夠其實不是成心要這麼做)的成績依然存在。
是的,我確切曉得有些特別的宏其實不會招致C/C++預處置宏如許的成績。然則,我無意去成長C++中的宏。作為替換,我推舉應用C++說話中適合的對象,例如內聯函數,模板,結構函數(用來初始化),析構函數(用來消除),異常(用來加入高低文情況),等等。
好了,明天就先到這裡,今後我們再來更深刻的商量這個成績