Path: ...!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Ike Naar Newsgroups: comp.lang.c Subject: Re: how to make a macro work as a single line if stmt without braces Date: Sat, 21 Sep 2024 09:15:40 -0000 (UTC) Organization: A noiseless patient Spider Lines: 35 Message-ID: References: Injection-Date: Sat, 21 Sep 2024 11:15:40 +0200 (CEST) Injection-Info: dont-email.me; posting-host="546acf6d755ca4358d09f1c5386b815c"; logging-data="1636204"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/GcldvGGEgvAPgMtGsSxmC" User-Agent: slrn/1.0.3 (Patched for libcanlock3) (NetBSD) Cancel-Lock: sha1:Y4eD32DKvQqPfvuQoOirmqYUA48= Bytes: 1779 On 2024-09-21, Mark Summerfield wrote: > I have this macro: > > #define WARN(...) \ > do { \ > fprintf(stderr, "%s#%d: ", __FILE__, __LINE__); \ > fprintf(stderr, __VA_ARGS__); \ > } while (0); > > [...] > > I would prefer to be able to write this instead: > > total++; > if (failed) > WARN("failed because..."); > else > ok++; > > but doing so results in a compiler error: > > error: 'else' without a previous 'if' After expansion of the WARN macro there are two semicolons before the 'else'. The first semicolon is from the } while (0); line, the second is from the WARN("failed because..."); line. Removing the semicolon from one of these two lines fixes the compiler error.