C言語を学んでいるものです。
freebsdのstrlenの実装を確認しています。
freebsd/strlen.c at master · lattera/freebsd
ここで実装されているtestbyte(x)というマクロについて、疑問があります。
なぜdo{...}while(0)で囲まれているのでしょうか。
試しにdo whileを取って、実行して見ましたが、問題なく動きました。
while(0)だと必ず終了するのでdo...whileを使う意味が無いように思います。
どういった理由で使用されているのでしょうか。
#include <sys/cdefs.h> #include <stdlib.h> static const unsigned long mask01 = 0x0101010101010101; static const unsigned long mask80 = 0x8080808080808080; #define LONGPTR_MASK (sizeof(long) - 1) #define testbyte(x) \ do { \ if (p[x] == '\0') \ return (p - str + x); \ } while (0) size_t ft_strlen(const char *str) { const char *p; const unsigned long *lp; long va, vb; lp = (const unsigned long *)((uintptr_t)str & ~LONGPTR_MASK); va = (*lp - mask01); vb = ((~*lp) & mask80); lp++; if (va & vb) for (p = str; p < (const char *)lp; p++) if (*p == '\0') return (p - str); for (; ; lp++) { va = (*lp - mask01); vb = ((~*lp) & mask80); if (va & vb) { p = (const char *)(lp); testbyte(0); testbyte(1); testbyte(2); testbyte(3); testbyte(4); testbyte(5); testbyte(6); testbyte(7); } } return (0); }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/25 09:13