2010-08-02 4 views
0

Итак, прошло 5 или 6 лет с тех пор, как я использовал C++ для большого проекта, и около полугода с тех пор, как в последний раз мне приходилось иметь дело с небольшими/тривиальными программами на C++ и временем выполнения C++ в Генеральная. Я решил, что хочу переучить язык, прежде всего потому, что он может оказаться очень актуальным для предстоящего проекта на работе.Relearning C++ и проблема с typedef

Я работаю в основном с C и Python, и я в настоящее время в точке, где я даже не в своей тарелке с синтаксисом петли ниже:

for(int i(0); i != n; ++i) {}

хотя я признаю, это не так сложно расшифровать.

Поскольку я понимаю, что было много дополнений к языку, а также библиотекам и, конечно, идиомам, узорам и стилям, я бы хотел попросить ваше мнение о хороших ресурсах, которые актуальны. Я бы хотел избежать учебников, которые используют подход «Это C с большим количеством дополнительных функций». У меня все еще есть обязательная копия «Язык программирования C++», который я изучаю, но я честно не знаю, где именно сосредоточиться. Шаблоны проектирования? Шаблоны и STL/Boost? Что-то другое?

Я открыт для всех предложений!

Также более конкретный вопрос относительно typedef. Является ли следующее:

typedef Type& TypeRef;

обычно считается хорошей практикой при предоставлении непрозрачных типов в рамках API? Со значимым именем, то есть. Совместим ли это с подходом, принятым такими библиотеками, как pthreads или libpcap, и если да, то желательно ли использовать указатель для той же работы?

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

+2

как насчет (int i = 0; i

+0

Ваш пример для цикла - это плохой код. «i (0)» выглядит как вызов функции функции с именем «i», а не любая обычная инициализация. –

+3

@aaaa Совершенно верно C++. – 2010-08-02 18:30:08

ответ

4

Чтобы ответить на ваш конкретный вопрос, typedefs, которые скрывают тот факт, что что-то является указателем или ссылкой, всегда являются плохими идеями - то же самое верно в C. Рассмотрим, например, непрозрачный тип FILE - нужно еще явно создать Указатели FILE для его использования.

Что касается книг, см. The Definitive C++ Book Guide and List.

+1

Я только что нашел копию Meyer's Effective C++ * на работе, и, поскольку она предлагается, я начну с нее. Благодаря! –

3

Мне никогда не нравятся типичные ссылки или типы указателей. Невозможно эффективно скрыть тот факт, что тип является указателем на ссылку, поскольку у них есть разные семантики вызова для клиентов, поэтому это просто приводит к путанице в моем опыте.

0

Политика typedef, принятая ядром Linux для C, является лучшей. По сути, политика заключается в том, чтобы не использовать typedefs, если вы не создаете абстракцию нового типа. Это полезно в тех случаях, когда типы низкого уровня различаются между архитектурами, но пользователи ядра предпочитают общий тип. Например, u64 задан конкретный тип, но базовый тип может измениться между сборками или архитектурами.

typedef u64 unsigned long long; 

Однако, весьма вероятно, что в C++ существуют различные идиомы с помощью определений типов, которые вполне приемлемы, однако, я бы освоиться с С перед C++.

Возможно, лучший способ получить переориентацию с C++ - это написать одноразовые программы, которые выполняют определенную функцию.Например, напишите шаблон, используйте библиотеку в Boost, создайте некоторые потоки, выделите некоторую память. Дело не в том, чтобы узнал все это, дело в том, чтобы видеть, и это так, что вы не задыхаетесь в воздухе позже, когда это шоу.

Вот стандартное ядро ​​Linux ЬурейеЕ, взятый из http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.33.y.git;a=blob_plain;f=Documentation/CodingStyle;hb=HEAD

Chapter 5: Typedefs 

Пожалуйста, не используйте такие вещи, как "vps_t".

Это ошибка использовать typedef для структуры и указатели. Когда вы увидите: a

vps_t a;

в источнике, что это значит?

В отличие от этого, если он говорит

структура virtual_container * а;

Вы действительно можете сказать, что такое «а».

Многие считают, что typedefs «читаемость читаемости». Не так. Они полезны только для:

(а) полностью непрозрачные объекты (где ЬурейеЕ активно используется для шкурой , что объект).

Example: "pte_t" etc. opaque objects that you can only access using 
the proper accessor functions. 

NOTE! Opaqueness and "accessor functions" are not good in themselves. 
The reason we have them for things like pte_t etc. is that there 
really is absolutely _zero_ portably accessible information there. 

(б) Четкие целые типы, где абстракция помогает избежать путаницы , является ли это «ИНТ» или «длинный».

u8/u16/u32 are perfectly fine typedefs, although they fit into 
category (d) better than here. 

NOTE! Again - there needs to be a _reason_ for this. If something is 
"unsigned long", then there's no reason to do 

typedef unsigned long myflags_t;

but if there is a clear reason for why it under certain circumstances 
might be an "unsigned int" and under other configurations might be 
"unsigned long", then by all means go ahead and use a typedef. 

(с) при использовании разреженным буквально создать тип нового для проверки типа.

(d) Новые типы, идентичные стандартным типам C99, в некоторых случаях исключительных обстоятельствах.

Although it would only take a short amount of time for the eyes and 
brain to become accustomed to the standard types like 'uint32_t', 
some people object to their use anyway. 

Therefore, the Linux-specific 'u8/u16/u32/u64' types and their 
signed equivalents which are identical to standard types are 
permitted -- although they are not mandatory in new code of your 
own. 

When editing existing code which already uses one or the other set 
of types, you should conform to the existing choices in that code. 

(e) Типы, безопасные для использования в пользовательском пространстве.

In certain structures which are visible to userspace, we cannot 
require C99 types and cannot use the 'u32' form above. Thus, we 
use __u32 and similar types in all structures which are shared 
with userspace. 

Может быть, есть и другие случаи, но правило должно быть в основном в NEVER EVER использовать ЬурейиЙ, если вы не можете четко соответствовать одному из этих правил.

В общем, указатель или структура , которая имеет элементы, которые могут разумно быть доступны непосредственно должна никогда быть ЬурейиМи.

+7

«Мне было бы удобно с C до C++» - большинство людей не согласится с вами. – 2010-08-02 18:31:45

+0

Почему вы так говорите? Возможно, это вопрос перспективы. Я оцениваю обучение C до C++ как с более глубоким пониманием C++, так и с моей глубокой ненавистью к C++;) Я думаю, что если время в ваших интересах, то yeh, C++ сначала в порядке, это не так сложно сравнивать к C. –

+0

@Noah Я говорю это, потому что большинство людей не согласится с вами - этот вопрос был задан очень часто. Конечно, доктор Страуструп делает. Я сам изучил C до C++, но я бы не стал прислушиваться к любому глубокому пониманию, которое у меня могло бы быть, - это было бы связано с обучением ассемблера до C :-) – 2010-08-02 19:04:49

Смежные вопросы