Когда использовать #define против typedef? - PullRequest
0 голосов
/ 02 апреля 2020

Итак, я все время пытаюсь сократить using namespace std, так как теперь я немного понимаю, какие конфликты это может вызвать в коде, и хотя я не собираюсь использовать чужой код в ближайшее время, Я хочу научиться использовать передовые практики ...

Но мне все еще не нравится, как выглядит код, когда вы разбрасываете по нему операторы области видимости, один совет, который я натолкнулся, - использовать typedefs чтобы немного изменить внешний вид, я написал следующее:

#include <iostream>
#include <fstream>
#include <string>

typedef std::cout std_cout;
typedef std::endl std_endl;
typedef std::string std_string;
typedef std::fstream std_fstream;
typedef std::ios std_ios;

Теперь, когда я набираю это, все нормально, за исключением первых двух строк (во втором блоке кода), которые дают мне variable "std::cout" is not a type name и function template "std::endl" is not a type name сообщения об ошибках соответственно.

Теперь, если бы я должен был заменить все typedef с #define с, первоначально проблема, казалось бы, была решена, но затем я бы закончил с многочисленными синтаксическими ошибками в каждой строке, содержащей одно из этих определений. (Кроме того, я знаю, что #define также проблематичен c, как и using namespace std, поэтому я стараюсь и этого избегать)

Чтобы еще больше усложнить ситуацию, первая строка (в тот же блок), который является одной из двух проблемных строк c здесь, является одной прямой, идентичной той, которую я видел в многочисленных источниках в Интернете, поэтому я не знаю, что правильно больше ...

Как правильно определить тип данных?

Заранее спасибо.

1 Ответ

6 голосов
/ 02 апреля 2020

Прежде всего, std::cout это не тип, это объект. Следовательно, использование

typedef std::cout std_cout;

не сработает.

Использование

typedef std::string std_string;

является законным. Однако у меня есть следующие проблемы:

  1. Когда читатель кода видит std_string, он задается вопросом, что это значит, и должен будет отследить его определение. Это ненужная трата времени по сравнению с использованием std::string.

  2. Использование std_string экономит вам только один символ при наборе текста. Это не большая экономия времени, необходимого для создания кода.

  3. Вы не сможете помешать другим в вашей команде использовать std::string. Когда оба существуют в кодовой базе, это ужасно.

Но мне все еще не нравится, как выглядит код, когда вы разбрасываете по нему операторы области видимости, один совет наткнулся на использование typedef s, чтобы настроить, как все выглядит немного

Это плохой совет, ИМХО.

Мое предложение: Не беспокойтесь с typedef с. Просто используйте полное имя. Это делает для более удобочитаемого и обслуживаемого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...