Więc optymalizuję niektóre kod przez rozwijanie niektórych pętli (tak, wiem, że powinienem polegać na moim kompilatorze, aby to zrobić dla mnie, ale nie pracuję z moim wyborem kompilatorów) i Chciałem zrobić to z wdziękiem, aby w przypadku zmiany rozmiaru danych z powodu pewnych zmian w przyszłości kod ulegnie eleganckiemu zniszczeniu.Równoważnik rozmiaru C dla makr
Coś jak:
typedef struct {
uint32_t alpha;
uint32_t two;
uint32_t iii;
} Entry;
/*...*/
uint8_t * bytes = (uint8_t *) entry;
#define PROCESS_ENTRY(i) bytes[i] ^= 1; /*...etc, etc, */
#if (sizeof(Entry) == 12)
PROCESS_ENTRY(0);PROCESS_ENTRY(1);PROCESS_ENTRY(2);
PROCESS_ENTRY(3);PROCESS_ENTRY(4);PROCESS_ENTRY(5);
PROCESS_ENTRY(6);PROCESS_ENTRY(7);PROCESS_ENTRY(8);
PROCESS_ENTRY(9);PROCESS_ENTRY(10);PROCESS_ENTRY(11);
#else
# warning Using non-optimized code
size_t i;
for (i = 0; i < sizeof(Entry); i++)
{
PROCESS_ENTRY(i);
}
#endif
#undef PROCESS_ENTRY
ten nie działa, oczywiście, ponieważ sizeof
nie jest dostępne dla pre-procesor (przynajmniej, że to, co wydawało się wskazywać this answer).
Czy istnieje łatwe obejście problemu, dzięki któremu mogę uzyskać sizeof
strukturę danych do użycia z makrem C, czy też po prostu SOL?
Cóż, sizeof() ** to ** makro. Wbudowane przynajmniej makro. – Havenard
sizeof nie jest makrem, w dowolnym kształcie lub formie –
sizeof nie jest makro, chociaż offset to. sizeof jest bardziej operatorem. –