Все еще пытаюсь обернуть мою голову вокруг Clojure. Я вижу, как реализовать следующее в Haskell, Python и т. Д., Но пока не понимаю, как написать это в Clojure. Цените, если кто-то может показать мне основную структуру. Псевдокод ниже.
a = get_a
if (a == bad_value) then throw exception_a
b = get_b
if (b == bad_value) then throw exception_b
c = get_c
if (c == bad_value) then throw exception_c
...
do_action_with a b c
Будет ли это набором слов, а затем финальным выражением? Спасибо. Я хочу использовать sizeof, чтобы быть безопасным / педантичным. typedef struct _parent {float calc; текст char [255]; Int используется; } parent_t; ...
Я пытаюсь объявить структуру, которая зависит от другой структуры.
I want to use sizeof
to be safe/pedantic.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Now I want to declare a struct child_t
that has the same size as parent_t.text
.
How can I do this? (Pseudo-code below.)
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
I tried a few different ways with parent_t
and struct _parent
, but my compiler will not accept.
As a trick, this seems to work:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
Is it possible to declare child_t
without the use of dummy
?
Хотя определение размера буфера с помощью #define
- это один идиоматический способ сделать это, другой способ - использовать такой макрос:
#define member_size(type, member) sizeof(((type *)0)->member)
и использовать его как это:
typedef struct
{
float calc;
char text[255];
int used;
} Parent;
typedef struct
{
char flag;
char text[member_size(Parent, text)];
int used;
} Child;
На самом деле я немного удивлен, что sizeof ((type *) 0) -> member)
разрешено даже в качестве константного выражения. Крутая вещь.
Я сейчас не на своей машине для разработки, но я думаю, что вы можете сделать одно из следующего:
sizeof(((parent_t *)0)->text)
sizeof(((parent_t){0}).text)
Вы можете использовать директиву препроцессора для size as:
#define TEXT_MAX_SIZE 255
и использовать ее как в родительском, так и в дочернем файле.
Используйте директиву препроцессора, например #define:
#define TEXT_LEN 255
typedef struct _parent
{
float calc ;
char text[TEXT_LEN] ;
int used ;
} parent_t ;
typedef struct _child
{
char flag ;
char text[TEXT_LEN] ;
int used ;
} child_t ;
Другая возможность - определить тип. Я думаю, что тот факт, что вы хотите обеспечить одинаковый размер для двух полей, является индикатором того, что у вас одинаковая семантика для них.
typedef char description[255];
, а затем иметь поле
description text;
в обоих ваших типах.