C マクロ 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(#define)
(#define)
83行: 83行:
 
int main(){
 
int main(){
 
     int nMacroValue;
 
     int nMacroValue;
     int a = 20;
+
     int nMacroValue1;
     int b = 30;
+
    int x = 20;
     nMacroValue = __MY_MACRO_ADD_(a, b) * 10;
+
     int y = 30;
 +
     nMacroValue = __MY_MACRO_ADD_(x, y) * 10;
 
     nMacroValue1 = __MY_MACRO_ADD_(90, 110) * 10;
 
     nMacroValue1 = __MY_MACRO_ADD_(90, 110) * 10;
 
}
 
}
93行: 94行:
 
int main(){
 
int main(){
 
     int nMacroValue;
 
     int nMacroValue;
     int a = 20;
+
     int x = 20;
     int b = 30;
+
     int y = 30;
     nMacroValue = (20 + 30) * 10;
+
    int nMacroValue;
     nMacroValue1 = (90 + 110) * 10;
+
    int nMacroValue1;
 +
     nMacroValue = ( x + y ) * 10;// x = 20,y = 30,
 +
                                //( 20 + 30 ) *10 → 500
 +
     nMacroValue1 = ( 90 + 110 ) * 10;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
108行: 112行:
 
int main(){
 
int main(){
 
     int nMacroValue;
 
     int nMacroValue;
     int a = 20;
+
     int x = 20;
     int b = 30;
+
     int y = 30;
     nMacroValue = __MY_MACRO_ADD_(a, b) * 10;
+
    int nMacroValue;
 +
    int nMacroValue1;
 +
     nMacroValue = __MY_MACRO_ADD_(x, y) * 10;
 
     nMacroValue1 = __MY_MACRO_ADD_(90, 110) * 10;
 
     nMacroValue1 = __MY_MACRO_ADD_(90, 110) * 10;
 
}
 
}
118行: 124行:
 
int main(){
 
int main(){
 
     int nMacroValue;
 
     int nMacroValue;
     int a = 20;
+
     int x = 20;
     int b = 30;
+
     int y = 30;
     nMacroValue = ( a + b + a + b ) * 10;//a = 20,b = 30,(20 + 30 + 20 + 30) * 10 → 1000
+
    int nMacroValue;
     nMacroValue1 = ( a + b + a + b ) * 10;// 4000
+
    int nMacroValue1;
 +
     nMacroValue = ( x + y + x + y ) * 10;//a = 20,b = 30,(20 + 30 + 20 + 30) * 10 → 1000
 +
     nMacroValue1 = ( 90 + 110 + 90 + 110 ) * 10;// 4000
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
132行: 140行:
 
int main(){
 
int main(){
 
     int nMacroValue;
 
     int nMacroValue;
     int a = 20;
+
     int x = 20;
     int b = 30;
+
     int y = 30;
     nMacroValue = __MY_MACRO_MAX__(a, b) * 10;
+
    int nMacroValue;
 +
    int nMacroValue1;
 +
    int nMacroValue2;
 +
    int nMacroValue3;
 +
     nMacroValue = __MY_MACRO_MAX__(x, y) * 10;
 
     nMacroValue1 = __MY_MACRO_MAX__(90, 110) * 10;
 
     nMacroValue1 = __MY_MACRO_MAX__(90, 110) * 10;
     nMacroValue2 = __MY_MACRO_SWAP__(a, b) * 10;
+
     nMacroValue2 = __MY_MACRO_SWAP__(x, y) * 10;
 
     nMacroValue3 = __MY_MACRO_SWAP__(90, 110) * 10;
 
     nMacroValue3 = __MY_MACRO_SWAP__(90, 110) * 10;
 
}
 
}
144行: 156行:
 
int main(){
 
int main(){
 
     int nMacroValue;
 
     int nMacroValue;
     int a = 20;
+
     int x = 20;
     int b = 30;
+
     int y = 30;
     nMacroValue  = ( (a) > (b) ? (a) : (b) ) * 10;//a = 20, b = 30,  
+
    int nMacroValue;
 +
    int nMacroValue1;
 +
    int nMacroValue2;
 +
    int nMacroValue3;
 +
     nMacroValue  = ( (x) > (y) ? (x) : (y) ) * 10;//x = 20, y = 30,  
 
                              //( (20) > (30) ? (20) : (30) ) * 10 → 300
 
                              //( (20) > (30) ? (20) : (30) ) * 10 → 300
     nMacroValue1 = ( (a) > (b) ? (b) : (b) ) * 10;//a = 90, b = 110,
+
     nMacroValue1 = ( (90) > (110) ? (90) : (110) ) * 10;//
                                                  //( (90) > (110) ? (90) : (110) ) * 10 → 1100
+
                                                        //( (90) > (110) ? (90) : (110) ) * 10 → 1100
     nMacroValue2 = {int c; c = a; a = b; b = c;} * 10;//a = 20, b = 30
+
     nMacroValue2 = {int c; c = x; x = y; y = c;} * 10;//x = 20, y = 30
                                                       //{int c; c ← 20; a ← 30; b ← c(20);} * 10 → 0
+
                                                       //{int c; c ← 20; x ← 30; y ← c(20);} * 10
     nMacroValue3 = {int c; c = a; a = b; b = c;} * 10;//a = 90, b = 110
+
                                                      // → {…} * 10 → 0(xとy)の値は入れ替わる。
                                                      //{int c; c ← 90; 90 ← 110; 110 ← c(90);} * 10 → 0
+
     nMacroValue3 = {int c; c = 90; 90 = 110; 110 = c;} * 10;//{int c; c ← 90; 90 ← 110; 110 ← c(90);} * 10 → 0
 
                                                       //コンパイル エラー
 
                                                       //コンパイル エラー
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
といった具合に複雑な計算式を当て込むことで、最大値や値の入れ替えした値を返却するマクロとしての機能を持つ置換処理をプログラムソース全体にわたって処理してくれます。。ただしトークンの置き換えでMAXに一致すると処理が変わる可能性があるため、マクロ名が重複しないようにする必要があることと、引数付きの複雑なプログラムソースを組み込んだマクロ定義によって使い方を間違えるとエラーになるケースが生じることにも注意が必要になります。
+
といった具合に複雑な計算式を当て込むことで、最大値や値の入れ替えした値を返却するマクロとしての機能を持つ置換処理をプログラムソース全体にわたって処理してくれます。。ただしトークンの置き換えでMAXに一致すると処理が変わる可能性があるため、マクロ名が重複しないようにする必要があることと、引数付きの複雑なプログラムソースを組み込んだマクロ定義によって使い方を間違えるとエラーになるケースが生じることにも注意が必要になります。マクロの定義によっても、無意識のうちに構文エラーになるような使い方になってしまうような間違いも発生しやすいです。汎用性の高いマクロになっているか、よく確かめる必要があります。計算の優先度の入れ替わりや置き換え後の;や}の利用によって構文エラーになっていないか?意図した計算結果がいつでも得られるマクロになっているかを確実なものにする技術が必要です。
 +
 
 +
 
 +
あまり、ややこしいマクロは組み込まない方が分かりやすいですが、使わざるを得ないプロジェクトがあれば、使ってプログラムのメンテナンス性を向上させることができます。自分ではあまりマクロを組み込まないという人でも、少なくとも他人が組んだマクロの展開結果が何を意図しているか読み解く力があれば、問題ないと思います。
  
 
==='''#undef'''===
 
==='''#undef'''===

2015年3月19日 (木) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス