| Hmm, here are some things that I do routinely that don't really show up: ꙮ I always use enum instead of #define for numeric constants. ꙮ I nearly always use inline instead of #define for small functions whose efficiency worries me. ꙮ As a result of those two things, I don't use #define much. ꙮ Everything global is static unless it's in the public API provided by the file. ꙮ I use dynamic allocation a lot more than the C in the K&R book. ꙮ I avoid integer function arguments and return values as much as possible, because they're basically untyped, and I benefit from the limited static type checking done by C compilers. I still use them for cases where I'm actually counting or measuring something, and unfortunately for bitfields. When I'm counting bytes, the correct type is usually size_t or ptrdiff_t, which benefits humans and LP64 platforms, but doesn't get you much static type checking benefit. ꙮ As a result of those two things, I use arrays relatively sparingly. ꙮ I basically never use function-static variables because they make thread-safety very difficult if not impossible. ꙮ Use const wherever applicable. It catches some errors, and it's not nearly as draconian as in C++, so it doesn't cause as many problems. ꙮ After some experience with C++, I usually "typedef struct foo foo", since it costs me two words in the declaration and saves me the "struct" every time I use "foo" later. I don't know if these are the kinds of things people mean when they talk about new ways of coding in C, or where to find them documented. |
What do you think is the minimum realistic preprocessor usage that can be got away with? #include + #pragma once?