Malloc & Init - MACRO

hlasů
2

Je možné přepsat následující kód, takže by to bylo ISO C vyhovující? Následující makra dělají malloc & init pro daný typ a hodnotu.

Současný kód pracuje s gcc překladače (u SES GCC prodloužení ), ale to není standardní. Mám-li použít -pedantic, jsem obdržel varování.

#ifdef __GNUC__

#define NM_CVPTR(type, value) \
    ({ \
        type * var = NULL; \
        var = nm_malloc(sizeof(*var)); \
        *var = value; \
        (const void*) var; \
    }) \

#define NM_VPTR(type, value) \
    ({ \
        type * var = NULL; \
        var = nm_malloc(sizeof(*var)); \
        *var = value; \
        (void*) var; \
    }) \

#define NM_PTR(type, value) \
    ({ \
        type * var = NULL; \
        var = nm_malloc(sizeof(*var)); \
        *var = value; \
        (type *) var; \
    }) \

#endif
Položena 20/06/2010 v 18:31
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Můžete použít memcpypřiřadit hodnotu a pak ukazatel vrátil. Vkládá se používá dvě různé verze v závislosti na tom, zda vaše počáteční hodnota je primitivní typ (integer, float, ukazovátka ...), nebo zda se jedná o struct. Verze hodnota používá sloučeninu doslovný (type){ (value) }, tak to platí pouze v C99.

#include <stdlib.h>
#include <string.h>

static inline
void* memcpy_safe(void* target, void const* source, size_t n) {
  if (target) memcpy(target, source, n);
  return target;
}

#define NM_PTR_RVALUE(type, rvalue)                                     \
  ((type*)memcpy_safe(malloc(sizeof(type)), &(type){ (rvalue) }, sizeof(type)))

#define NM_PTR_LVALUE(type, lvalue)                                     \
  ((type*)memcpy_safe(malloc(sizeof(type)), &(lvalue), sizeof(type)))

typedef struct {
  int a;
} hoi;

hoi H7 = {.a = 7};

int main() {
  int* a = NM_PTR_RVALUE(int, 7);
  hoi* b = NM_PTR_LVALUE(hoi, H7);
}

(Přidáno NULL podívejte se sem, který používá vložené funkce, i když to nebylo požadováno původně).

BTW, v jazyce C ++ na rozdíl od C operátor přiřazení =vrací lvalue, tak pro C ++ by pravděpodobně mohlo hrát hry s tím.

Odpovězeno 20/06/2010 v 22:54
zdroj uživatelem

hlasů
2

To lze provést pomocí operátoru čárka , ale ve standardním C nebude moci deklarovat proměnnou jako součást výrazu, takže budete muset předat název var‚s výměnou na makro:

// C - comma operator but not able to declare the storage during the
// expression.
#define NM_PTR(type, var, value) \
    (var = nm_malloc(sizeof(*var)), \
    *var = value, \
    (type * var))

V některých překladačů a v jazyce C ++, můžete deklarovat úložiště pro var in-line následovně:

// C99 and C++
#define NM_PTR(type, value) \
    (type * var = nm_malloc(sizeof(*var)), \
    *var = value, \
    (type * var))

Potíž s použitím výše uvedeného makro je, že neexistuje žádný blok prostor v makro těla, takže definice varje ‚viditelný‘ na úrovni bloku a každá makro lze použít pouze jednou za bloku.

Edit: Díky Jens Gustedt pro lov, že navrhovaný C ++ makro nefunguje.

Odpovězeno 20/06/2010 v 18:42
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more