добавить jquery ui плагин на вашей странице.
function JsonDateFormate (dateFormate, jsonDateTime) {return $ .datepicker.formatDate (dateFormate, eval ('new' + jsonDateTime.slice (1, -1))); };
В C ++ существует только тонкая разница.
Стандарт языка C ( C89 §3.1.2.3 , C99 §6.2.3 , и C11 §6.2.3 ) задает отдельные пространства имен для разных категорий идентификаторов, включая идентификаторы тегов (для struct
/ union
/ enum
) и обычных идентификаторов (для typedef
и других идентификаторов).
Если вы только что сказали:
struct Foo { ... };
Foo x;
, вы получите ошибку компилятора, потому что Foo
определяется только в пространстве имен тегов.
Вы должны были бы объявить его как:
struct Foo x;
В любое время, когда вы хотите обратиться к Foo
, вам всегда нужно называть его struct Foo
, Это раздражает быстро, поэтому вы можете добавить typedef
:
struct Foo { ... };
typedef struct Foo Foo;
Теперь struct Foo
(в пространстве имен тегов) и просто Foo
(в пространстве имен обычного идентификатора) оба относятся к то же самое, и вы можете свободно объявлять объекты типа Foo
без ключевого слова struct
.
Конструкция:
typedef struct Foo { ... } Foo;
является просто аббревиатурой для объявление и typedef
.
Наконец,
typedef struct { ... } Foo;
объявляет анонимную структуру и создает для нее typedef
. Таким образом, с этой конструкцией он не имеет имени в пространстве имен тегов, а только имя в пространстве имен typedef. Это означает, что он также не может быть пролонгирован. Если вы хотите сделать прямое объявление, вы должны указать ему имя в пространстве имен тегов .
В C ++ все struct
/ union
/ enum
/ class
декларации действуют так, как будто они неявно typedef
'ed, если имя не скрыто другим объявлением с тем же именем. См. ответ Майкла Берра для полной информации.
Struct - создать тип данных. Typedef - установить псевдоним для типа данных.
Есть разница, но тонкая. Посмотрите на это следующим образом: struct Foo
вводит новый тип. Второй создает псевдоним Foo (а не новый тип) для неназванного типа struct
.
7.1.3 Спецификатор typedef
1 [.. .]
Имя, объявленное с помощью спецификатора typedef, становится typedef-name. В пределах своей декларации имя typedef синтаксически эквивалентно ключевому слову и называет тип, связанный с идентификатором, способом, описанным в разделе 8. Таким образом, typedef-name является синонимом другого типа. Имя typedef не вводит новый тип , как это делает объявление класса (9.1) или объявление enum.
8 Если декларация typedef определяет неназванный класс (или перечисление) , первое имя typedef, объявленное объявлением как тип класса (или тип перечисления), используется для обозначения типа класса (или типа перечисления) только для целей привязки (3.5). [Пример:
blockquote>typedef struct { } *ps, S; // S is the class name for linkage purposes
Итак, typedef всегда используется в качестве заполнителя / синонима для другого типа.
Еще одно важное отличие: typedef
s не может быть объявлено вперед. Таким образом, для опции typedef
вы должны #include
файла, содержащего typedef
, что означает все, что #include
s, ваш .h
также включает этот файл, независимо от того, нуждается он в этом или нет, и так далее.
Без typedef
в некоторых случаях вы можете просто добавить объявление вперед struct Foo;
в верхней части вашего .h
файла и только #include
определение структуры в вашем файле .cpp
.
Важное различие между «typedef struct» и «struct» в C ++ заключается в том, что инициализация inline-члена в «typedef structs» не будет работать.
// the 'x' in this struct will NOT be initialised to zero
typedef struct { int x = 0; } Foo;
// the 'x' in this struct WILL be initialised to zero
struct Foo { int x = 0; };
x
. См. тест в онлайн-среде ID Coliru (я инициализировал его до 42, чтобы он был более очевидным, чем с нулем, что назначение действительно имело место).
– Colin D Bennett
29 July 2016 в 16:24
В C ++ нет разницы, но я верю в C, что позволит вам явно объявлять экземпляры структуры Foo:
struct Foo bar;
Вы не можете использовать форвардное объявление с помощью typedef struct.
Сама структура является анонимным типом, поэтому у вас нет фактического имени для переадресации объявления.
typedef struct{
int one;
int two;
}myStruct;
Прямое объявление, подобное этому, не работает:
struct myStruct; //forward declaration fails
void blah(myStruct* pStruct);
//error C2371: 'myStruct' : redefinition; different basic types
myStruct
живет в пространстве имен тегов, а typedef_ed myStruct
живет в обычном пространстве имен, в котором живут другие идентификаторы, такие как имя функции, имена локальных переменных. Поэтому конфликта не должно быть. Я могу показать вам свой код, если вы сомневаетесь любая ошибка в нем.
– Rich
13 March 2014 в 10:07
typedef
, декларацию вперед с именем typedef
ed, не ссылаются на неназванную структуру. Вместо этого переднее объявление объявляет неполную структуру с тегом myStruct
. Кроме того, не видя определения typedef
, прототип функции с использованием имени typedef
ed не является законным. Таким образом, мы должны включать весь typedef всякий раз, когда нам нужно использовать myStruct
для обозначения типа. Исправьте меня, если я неправильно понял вас. Благодарю.
– Rich
13 March 2014 в 10:23