2016-04-09 5 views
0

Какой из этих методов более безопасен для определения типов переменных? Я знаю, что мы все нахмуримся, когда видим #defines, но, похоже, это работает так же, как typedef:Правильный способ определения типа (typedef vs #define)

Есть ли преимущество в том или ином виде, и если да, то что это может быть?

Метод один:

#include <iostream> 

    #define byte unsigned char 

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

     return 0; 
    } 

Способ второй:

 #include <iostream> 

    int main() { 
     typedef unsigned char byte; 

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

     return 0; 
    } 
+0

Что означает «более безопасный»? –

+6

Ваш метод 1 - ужасная практика. –

+1

Предпочитайте, если возможно, фактические функции языка по функциям препроцессора. Другими словами, избегайте макросов. – Logicrat

ответ

8

Вы должны всегда использовать 2-ым (т.е. typedef или using).

Постарайтесь не использовать макросы на C++, насколько это возможно, и в большинстве случаев можно было бы избежать. Они просто заменяют текст перед компиляцией и более «опасны». например

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

Отлично! Спасибо за ответ –

+0

. Следует также упомянуть, что вы должны определить отдельный заголовок с этими объявлениями 'use' или' typedef', он будет не только охватить все для одного файла, но и позволить вам слишком менять значения в одном и том же одно место. –

1

Использование #define не является безопасным (см другого ответа) Использования ЬурейеГо обычным способ определения типов псевдонимов.

Там также новый «с помощью» Синтаксис

using MyByte = unsigned char; 

увидеть этот ответ на соответствующий вопрос (ЬурейеЕ против использования) https://stackoverflow.com/a/10748056/446303

0

Go с typedef. Существует много причин, но первое, что приходит в голову, состоит в том, что typedef применяется к области, где она объявлена, но #define игнорирует область действия и применяется к остальной части любого исходного модуля, в котором она определена. По этой причине, typedef является «более безопасным».

1

Только один из ваших примеров на самом деле является способом определения типа, поэтому между ними нет конкуренции.


#define byte unsigned char 

Это только делает все высказывания byte в коде заменяются с unsigned char перед началом компиляции. Он не определяет тип.

Объявление int byte; станет int unsigned char;, что является бессмыслицей.


typedef unsigned char byte; 

Это определяет тип. Тип будет подчиняться правилам синтаксиса, правилам охвата и всем этим прекрасным вещам.

Объявление int byte; по-прежнему будет объявлением int byte;, так как byte здесь находится в пространстве для имени переменной.


using byte = unsigned char; 

Это «современный» способ определить тип псевдонима, который имеет гораздо более четкое синтаксис, чем typedef заявление (особенно для более сложных типов).

Это было введено, потому что в противном случае новый синтаксис для шаблонов типа был бы почти невозможным, чтобы сделать разумным.

+0

Ницца и ясно, поэтому ^ – sjsam