Политика 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 использовать ЬурейиЙ, если вы не можете четко соответствовать одному из этих правил.
В общем, указатель или структура , которая имеет элементы, которые могут разумно быть доступны непосредственно должна никогда быть ЬурейиМи.
как насчет (int i = 0; i
Ваш пример для цикла - это плохой код. «i (0)» выглядит как вызов функции функции с именем «i», а не любая обычная инициализация. –
@aaaa Совершенно верно C++. – 2010-08-02 18:30:08