程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中宏的應用成績詳解

C++中宏的應用成績詳解

編輯:關於C++

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++說話中適合的對象,例如內聯函數,模板,結構函數(用來初始化),析構函數(用來消除),異常(用來加入高低文情況),等等。

好了,明天就先到這裡,今後我們再來更深刻的商量這個成績

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved