2016-04-09 8 views
0

変数の型を定義するのにこれらの方法の方が安全ですか?私は#defineを見ても目立たないが、typedefだけでなく、typedefとしてもうまくいくように思えます。タイプを定義する適切な方法(typedef vs #define)

何か利点がありますか?

方法1:

#include <iostream> 

    #define byte unsigned char 

    int main() { 
     byte testByte = 'A'; 
     std::cout << testByte << std::endl; 

     return 0; 
    } 

方法2:

 #include <iostream> 

    int main() { 
     typedef unsigned char byte; 

     byte testByte = 'A'; 
     std::cout << testByte << std::endl; 

     return 0; 
    } 
+0

「より安全」とはどういう意味ですか? –

+6

あなたの方法1はひどい習慣です。 –

+1

可能であれば、プリプロセッサ機能よりも実際の言語機能を使用することをお勧めします。つまり、マクロは避けてください。 – Logicrat

答えて

8

あなたは常に第二1(すなわちtypedefまたはusing)を使用する必要があります。

可能な限りC++でマクロを使用しないようにしてください。ほとんどの場合は避けることができます。コンパイル前のテキストの置換だけで、より危険なものです。例えばtypedefを使用して

#define byte_pointer unsigned char* 
byte_pointer p, q; // only p is a pointer 
+2

素晴らしい!ありがとうございます。 –

+0

これらの 'using'または' typedef'宣言で別のヘッダを定義しなければならないということを言及する必要があります。ひとつのファイルに対してすべてをスコープするだけでなく、一箇所。 –

1

の#defineを使用することは安全ではありません(他の回答を参照してください) は、タイプエイリアスを定義する通常の方法です。

あり、新たな "使用" 構文は

using MyByte = unsigned char; 

もありますtypedefhttps://stackoverflow.com/a/10748056/446303

0

ゴー(typedefを使用して対)関連の質問にこの回答を参照してください。多くの理由がありますが、最初に考えられるのは、typedefが宣言されているスコープに適用されますが、#defineはスコープを無視し、それが定義されているソースモジュールの残りの部分に適用されます。 typedefは「安全」です。

1

実際にあなたの例のうちの1つだけがタイプを定義する方法なので、それらの間にコンテストはありません。


#define byte unsigned char 

これだけでコンパイルが始まる前に、あなたのコード内のbyteのすべての発話がunsigned charに置き換えますなります。タイプを定義するものではありません。

宣言int byte;int unsigned char;になりますが、それはナンセンスです。


typedef unsigned char byte; 

これは、タイプを定義します。このタイプは、構文規則、有効範囲規則、そのすてきなものすべてに従います。

byteが変数名のスペースにあるため、int byte;の宣言は依然としてint byte;となります。


using byte = unsigned char; 

これは、(特に、より複雑なタイプの場合)typedef声明よりもはるかに明確な構文を持っているタイプの別名を定義するための「現代」方法です。

テンプレートエイリアスの新しい構文が正しくないために導入されていたため、これが導入されました。

+0

ニースとクリアなので、 – sjsam

関連する問題