How I Learned to Stop Worrying and Love Macros
Rust macros are powerful, that's a fact. I mean, they allow running any code at compile-time, of course they're powerful.
C macros, which are at the end of the day nothing more than glorified text substitution rules, allow you to implement new, innovative, modern language constructs, such as:
#define ever (;;)
for ever {
...
}
or even:
#include <iostream>
#define System S s;s
#define public
#define static
#define void int
#define main(x) main()
struct F{void println(char* s){std::cout << s << std::endl;}};
struct S{F out;};
public static void main(String[] args) {
System.out.println("Hello World!");
}
But these are just silly examples written for fun. Nobody would ever commit such macro abuse in real-world, production code. Nobody...
/* mac.h 4.3 87/10/26 */
/*
* UNIX shell
*
* S. R. Bourne
* Bell Telephone Laboratories
*
*/
...
#define IF if(
#define THEN ){
#define ELSE } else {
#define ELIF } else if (
#define FI ;}
#define BEGIN {
#define END }
#define SWITCH switch(
#define IN ){
#define ENDSW }
#define FOR for(
#define WHILE while(
#define DO ){
#define OD ;}
#define REP do{
#define PER }while(
#undef DONE
#define DONE );
#define LOOP for(