Aracılığıyla paylaş


Makrolar ve satır içi işlevleri

Ancak satır içi işlevleri (işlev kodu derleme zamanında çağrısı sırasında noktasında, genişletilmiş durumda çünkü) makrolar için benzer, satır içi işlevleri derleyici tarafından tarafından Önişlemci makroları genişletilir oysa ayrıştırıldı.Sonuç olarak, bazı önemli farklar vardır:

  • Satır içi işlevleri normal işlevlerine zorlanan tür güvenliği, tüm iletişim kuralları izleyin.

  • Satır içi işlevleri bunlar dışında diğer bir işlev aynı sözdizimini kullanarak belirtilmiş satır içi işlev bildirimi bir anahtar sözcük.

  • Satır içi işlev için bağımsız değişken olarak geçirilen ifadeler bir kez değerlendirilir.Bazı durumlarda, birden çok kez makrolar için bağımsız değişken olarak geçirilen ifadeler değerlendirilebilir.

Örnek

Aşağıdaki örnek, küçük büyük harflere dönüştüren makro gösterir:

// inline_functions_macro.c
#include <stdio.h>
#include <conio.h>

#define toupper(a) ((a) >= 'a' && ((a) <= 'z') ? ((a)-('a'-'A')):(a))

int main() {
   char ch;
   printf_s("Enter a character: ");
   ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

İfade amacı toupper(getc(stdin)) bir karakter konsol aygıttan okuma olduğunu (stdin) ve gerekirse, büyük harfe dönüştürdüyseniz.

Makro uygulaması nedeniyle getc belirlemek için karakter sayısından büyük veya eşit "a" olup sonra ve belirlemek için "z" küçük veya eşit olup bir kez Yürütülmüş Bu aralıkta ise getc karakter büyük harfe dönüştürmek için yeniden yürütüldü.Bu program, iki veya üç karakter bekler anlamına gelir, ideal olarak, yalnızca biri için beklemesi gerekir.

Satır içi işlevleri daha önce açıklanan sorunu çözmek:

// inline_functions_inline.cpp
#include <stdio.h>
#include <conio.h>

inline char toupper( char a ) {
   return ((a >= 'a' && a <= 'z') ? a-('a'-'A') : a );
}

int main() {
   printf_s("Enter a character: ");
   char ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

Ayrıca bkz.

Başvuru

satır içi, __inline, __forceinline