この記事では、C ++コースのDitaiソフトウェア・カレッジTangzuo林先生から学びます
導入:Cマクロ機能ブロックを置換するためにC ++インライン関数を導入されています
実験1:VSマクロブロックインライン
注意:在C++开发中首选内联函数定义代码块,而不是宏
実験2:強制インライン
C言語マクロ定数テキストキーは、副作用として、あるいは前処理の間に実行され、任意の構文チェック、型チェックを行いません。だから、constキーワードのためのC ++で定数が定義されてCONST、アップグレードされましたが、我々はマクロ定数を使用する場合はそのC ++で、私たちが直接与えられたのconst使用することができ、真の意味での定数ではなく、読み取り専用変数となっていますマクロ定数を交換する定数。さらに、我々はCのマクロブロックを設定することができ、そう頻繁に副作用で、マクロブロックを使用して、関数の関数であるように見えますが、ありません。C ++でのソリューションを提供し、マクロブロックは、C -----インライン関数を置き換えられています
C ++コンパイラは、要求インライン関数を満たしていない場合は、インライン関数は通常の関数となり、プッシュもあり、返品、その他の費用、ジャンプします。
実験1:VSマクロブロックインライン
#include <stdio.h>
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
inline int func(int a, int b)
{
return a < b ? a : b;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 3;
int c = FUNC(++a, b);
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
mhr@ubuntu:~/work/c++$ g++ 6-1.cpp
mhr@ubuntu:~/work/c++$ ./a.out
a = 3
b = 3
c = 3
mhr@ubuntu:~/work/c++$
#include <stdio.h>
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
inline int func(int a, int b)
{
return a < b ? a : b;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 3;
int c = func(++a, b);
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
mhr@ubuntu:~/work/c++$ g++ 6-1.cpp
mhr@ubuntu:~/work/c++$ ./a.out
a = 2
b = 3
c = 2
mhr@ubuntu:~/work/c++$
属性 G ++コンパイラ、キーワードではなく、標準C ++の構文がサポートさよりに比べて()。しかし、特別なG ++コンパイラがサポートするもの。
実験2:強制インライン
#include <stdio.h>
//__forceinline
__attribute__((always_inline))
inline
int add_inline(int n);
int main(int argc, char *argv[])
{
int r = add_inline(10);
printf(" r = %d\n", r);
return 0;
}
inline int add_inline(int n)
{
int ret = 0;
for(int i=0; i<n; i++)
{
ret += i;
}
return ret;
}
mhr@ubuntu:~/work/c++$ g++ 6-2.cpp
\mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$ ./a.out
r = 45
mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$