Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Welcome to Software Development on Codidact!

Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.

Post History

78%
+9 −1
Q&A What is do { } while(0) in macros and should we use it?

Background I can see the need to use { } when implementing a function-like macro such as this one: #define HCF(code) fprintf(stderr, "halt and catch fire"); exit(code); Because if we use the f...

2 answers  ·  posted 4y ago by Lundin‭  ·  last activity 1y ago by Karl Knechtel‭

Question c code-style macros
#1: Post edited by user avatar Lundin‭ · 2023-11-09T13:57:37Z (about 1 year ago)
  • **Background**
  • I can see the need to use `{}` when implementing a function-like macro such as this one:
  • #define HCF(code) fprintf(stderr, "halt and catch fire"); exit(code);
  • Because if we use the following calling code
  • bool bad = false;
  • if(bad)
  • HCF(0xDEADBEEF);
  • printf("good");
  • Then it will expand to
  • bool bad = false;
  • if(bad)
  • fprintf(stderr, "halt and catch fire");
  • exit(0xDEADBEEF);
  • printf("good");
  • which was not the intention - it will now exit with an error code even though the program is working as intended.
  • So the correct way would be to write the macro like this instead:
  • #define HCF(code) { fprintf(stderr, "halt and catch fire"); exit(code); }
  • ---
  • **Question**
  • But I've come across macros that instead of just plain braces `{ }` use this:
  • #define HCF(code) do { fprintf(stderr, "halt and catch fire"); \
  • exit(code); } while(0)
  • This seems similar to `{}` but more obscure. What's the purpose of this `do { } while(0)` and why should it be used instead of `{ }`?
  • **Background**
  • I can see the need to use `{ }` when implementing a function-like macro such as this one:
  • #define HCF(code) fprintf(stderr, "halt and catch fire"); exit(code);
  • Because if we use the following calling code
  • bool bad = false;
  • if(bad)
  • HCF(0xDEADBEEF);
  • printf("good");
  • Then it will expand to
  • bool bad = false;
  • if(bad)
  • fprintf(stderr, "halt and catch fire");
  • exit(0xDEADBEEF);
  • printf("good");
  • which was not the intention - it will now exit with an error code even though the program is working as intended.
  • So the correct way would be to write the macro like this instead:
  • #define HCF(code) { fprintf(stderr, "halt and catch fire"); exit(code); }
  • ---
  • **Question**
  • But I've come across macros that instead of just plain braces `{ }` uses this:
  • #define HCF(code) do { fprintf(stderr, "halt and catch fire"); \
  • exit(code); } while(0)
  • This seems similar to `{ }` but more obscure. What's the purpose of this `do { } while(0)` and why should it be used instead of `{ }`?