C
Chris M. Thomasson
Does anybody have any ideas on how I can improve the following hack:
_______________________________________________________________________
#include <stdio.h>
#include <stddef.h>
#define ALIGN_OF_X(mp_type, mp_var, mp_line) { \
struct ALIGN_OF ## mp_line { \
char pad; \
mp_type type; \
}; \
(*(mp_var)) = offsetof(struct ALIGN_OF ## mp_line, type); \
} ((void)0)
#define ALIGN_OF(mp_type, mp_var) \
ALIGN_OF_X(mp_type, mp_var, __LINE__)
int main(void) {
size_t alignment;
struct foo {
char a[2];
double b[5];
long int c[6];
char d;
};
ALIGN_OF(char, &alignment);
printf("ALIGN_OF(char) == %lu\n", (unsigned long)alignment);
ALIGN_OF(short int, &alignment);
printf("ALIGN_OF(short int) == %lu\n", (unsigned long)alignment);
ALIGN_OF(int, &alignment);
printf("ALIGN_OF(int) == %lu\n", (unsigned long)alignment);
ALIGN_OF(long int, &alignment);
printf("ALIGN_OF(long int) == %lu\n", (unsigned long)alignment);
ALIGN_OF(float, &alignment);
printf("ALIGN_OF(float) == %lu\n", (unsigned long)alignment);
ALIGN_OF(double, &alignment);
printf("ALIGN_OF(double) == %lu\n", (unsigned long)alignment);
ALIGN_OF(struct foo, &alignment);
printf("ALIGN_OF(struct foo) == %lu\n", (unsigned long)alignment);
return 0;
}
_______________________________________________________________________
?
Thanks.
_______________________________________________________________________
#include <stdio.h>
#include <stddef.h>
#define ALIGN_OF_X(mp_type, mp_var, mp_line) { \
struct ALIGN_OF ## mp_line { \
char pad; \
mp_type type; \
}; \
(*(mp_var)) = offsetof(struct ALIGN_OF ## mp_line, type); \
} ((void)0)
#define ALIGN_OF(mp_type, mp_var) \
ALIGN_OF_X(mp_type, mp_var, __LINE__)
int main(void) {
size_t alignment;
struct foo {
char a[2];
double b[5];
long int c[6];
char d;
};
ALIGN_OF(char, &alignment);
printf("ALIGN_OF(char) == %lu\n", (unsigned long)alignment);
ALIGN_OF(short int, &alignment);
printf("ALIGN_OF(short int) == %lu\n", (unsigned long)alignment);
ALIGN_OF(int, &alignment);
printf("ALIGN_OF(int) == %lu\n", (unsigned long)alignment);
ALIGN_OF(long int, &alignment);
printf("ALIGN_OF(long int) == %lu\n", (unsigned long)alignment);
ALIGN_OF(float, &alignment);
printf("ALIGN_OF(float) == %lu\n", (unsigned long)alignment);
ALIGN_OF(double, &alignment);
printf("ALIGN_OF(double) == %lu\n", (unsigned long)alignment);
ALIGN_OF(struct foo, &alignment);
printf("ALIGN_OF(struct foo) == %lu\n", (unsigned long)alignment);
return 0;
}
_______________________________________________________________________
?
Thanks.