4 ms·
If you ever want to give a c programmer a hard time, somehow sneak this into one of their headers: #define struct union
by stormbrew 10y ago
If you ever want to give a c programmer a hard time, somehow sneak this into one of their headers:
#define struct union
- raverbashing 10y agoAh there are funnier, less obvious ways
- qwertyuiop924 10y agoThe classic is: #define TRUE FALSE or the even more pernicious: #define 1 0
- stormbrew 10y agoI mean, as the sibling notes, there's redefining true as false, but I think making all structs unions is much funnier, especially in that it's a uniquely C proposition. There are other languages that allow redefinition of true and false. Also, I'm not sure how you think it's particularly obvious (as opposed to any other #define trick). It does only work if the project isn't warning-safe, as there are various ways this'll trigger ugly warnings (eg. using designated initializer syntax causes re-initialization warnings), but even then the warnings don't tend to actually tell you it's a union all of a sudden. If you have others, I'd like to hear them.
- qwertyuiop924 10y ago#define if while #define else while(!true){} That should be interesting.
- raverbashing 10y ago- Change the alignment of structs - Remember the order of includes change how they are applied. Have a #define that changes something in a .h that's included in some files but not in others - (Depending on the software) redefine rand() to be almost predictable or with a short loop
- therealidiot 10y agoI read somewhere about someone redefining goto as goat, but I can't remember where. Might have been the Lua Programming Gems book...
- naasking 10y ago#define NULL rand()
- CJefferson 10y agobetter, #ifdef NULL #undef NULL #endif #define NULL (void*)((size_t)!rand()) * Doesn't trigger errors * Will almost always return 0 (every time rand() returns a non-0 value), so code will almost never crash.
- danieltillett 10y agoThis is so evil. Now hide this in some macro and the fun will never end.
- hairy_man674 10y agoAny preprocessor definition that changes the language like that example makes C programmers rage. As a rule, typedef and macros and friends should be avoided for clarity and debugging (opinion). An actual example of this: The programmer who created Bourne Shell, at Bell Labs in 1970s, intentionally did this to make C more like Algol. I think BSD still uses some of the original code. Understandably, not everyone liked the idea.
- gefh 10y agoLegit usage: #define private public #include "some old thing I need the internals of but can't change.h"
- hairy_man674 10y agoC has no such keywords. Why the need for this hackery? Curious also if putting that in a header and including it in a C++ program even compiles without leading to undefined behaviour...
- to3m 10y agoThere's at least one compiler that adds visibility into the name mangling (is it gcc? Seems like the kind of thing they'd do), so if you unhide functions in this way you still won't necessarily be able to call them. (The compiler is also free to change the object layout when you do this, too, though I've no idea whether any of them do.)
- hairy_man674 10y ago> Seems like the kind of thing they'd do Forced to do by Microsoft C and C++ that mangle names.
- deleted 10y ago[deleted]
- chc 10y agoWhat's the problem with typedef? It just names a new type rather than making things work differently than you'd expect.