c语言 - 有没有正确的方法来制作'print message and continue'宏?



我希望能够做这样的事情:

while (line = fgets(line, n, input)) {
if (strlen(line) == 1)
print_and_continue("Blank line.n");
printf("%sn", line);
}

通常,执行此操作并涵盖所有语法复杂性的方法是使用一个怪异的do while(0)循环:

#define print_and_die(x) do {printf("%sn", (x)); exit(1);} while (0)

但是,我不能使用continue(或就此而言break)代替exit(1)因为它将应用于do while(0)循环,而不是我想要的循环。当然,我可以像这样定义宏:

#define print_and_continue(x) {printf("%sn", (x)); continue;}

并期望用户不要编写这样的代码:

if (something)
print_and_continue(x);
else {...}

但我想知道,有没有办法涵盖所有句法情况?


关于构造这种结构是否足够有用,以至于需要避免直接编写,评论中存在轻微的争论:

if (condition) {
printf("Failure.n");
continue;
}

只是为了说明这一点,如果有很多条件使您想要跳过处理数据(甚至在跳过数据之前部分处理数据),那么是的,它非常有用。

比较两者的可读性。 后者相当重复且不可读(并且编辑起来更棘手)

/* With print_and_continue() */
char buffer[BUFSIZ];
while (fgets(buffer, sizeof(buffer), input)) {
if (strlen(buffer) < 10)
print_and_continue("To small."); 
if (strlen(buffer) > 100)
print_and_continue("To large."); 
if (strcmp(buffer, "Do not print this"))
print_and_continue("Avoided printing a line.");
fputs(buffer, output); 
}
/* Without print_and_continue() */
char buffer[BUFSIZ];
while (fgets(buffer, sizeof(buffer), input)) {
if (strlen(buffer) < 10){
printf("Too small.n");
continue; 
}
if (strlen(buffer) > 100) {
printf("To large.n");
continue; 
}
if (strcmp(buffer, "Do not print this")) {
printf("Avoided printing a line.n");
continue;
}
fputs(buffer, output); 
}

你不应该这样做(如评论中所述)。 如果你仍然想这样做(你不应该这样做),你可以像这样尝试:

#include <stdio.h>
#define print_and_continue(x) if(printf("%sn", (x))) continue; else do{} while(0)
int main(int argc, char* argv[]) {
for(int i=0;i<argc;++i) {
if(i%2==0)
print_and_continue("Even arg");
else
printf("Uneven argn");
printf("This is printedn");
}
}

最新更新