我一直在讨论与同事一起使用size_t的问题.出现的一个问题是循环,它将循环变量递减直到达到零.
请考虑以下代码:
for (size_t i = n-1; i >= 0; --i) { ... }
Run Code Online (Sandbox Code Playgroud)
由于无符号整数环绕,这会导致无限循环.在这种情况下你做什么?编写上面的代码并没有意识到你犯了一个错误似乎很容易.
我们团队的两个建议是使用以下样式之一:
for (size_t i = n-1; i != -1 ; --i) { ... }
for (size_t i = n; i-- > 0 ; ) { ... }
Run Code Online (Sandbox Code Playgroud)
但我不知道还有其他选择......
我有一个函数,我可以用以下四种方式之一编写:
int do_or_die(int retval);
int do_or_die(ssize_t retval);
ssize_t do_or_die(int retval);
ssize_t do_or_die(ssize_t retval);
Run Code Online (Sandbox Code Playgroud)
然后,它将使用这两种方式调用库函数:
written = do_or_die(write(...)); // POSIX write returns ssize_t
printed = do_or_die(printf(...)); // printf returns int
Run Code Online (Sandbox Code Playgroud)
written和printed?我希望拥有最强大和标准的代码,同时仍然只有一个do_or_die功能.
我在这种情况下使用C99,但如果C11的答案不同,那么我也想知道这一点,以备将来使用.