Some C habits I employ for the modern day

(unix.dog)

57 points | by signa11 5 days ago ago

14 comments

  • matheusmoreira 2 hours ago

    > In the absence of proper language support, “sum types” are just structs with discipline.

    With enough compiler support they could be more than that. For example, I submitted a tagged union analysis feature request to gcc and clang, and someone generalized it into a guard builtin.

    https://github.com/llvm/llvm-project/issues/74205

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112840

    GCC proved to be too complex for me to hack this in though. To this day I'm hoping someone better than me will implement it.

    • nine_k an hour ago

      With proper discipline, one can even program a Turing machine directly. The problems are two: (1) Doing so is very slow and arduous, and (2) a chance of making a dangerous error is still quite high.

      For instance, it appears that no amount of proper discipline, even in the best developers, allows to replace proper array support with a naked pointer to a memory area.

      • matheusmoreira an hour ago

        The compiler's job is to program the turing machine for us. It should help as much as possible. For example, I really like using enums because compilers have extensive support for checking that all values have been handled in switch statements.

        I don't like it when compilers start getting in the way though. We use C because we want to do raw things like point a structure at some memory area in order to access the data stored there. The compiler's job is to generate the expected code without screwing it up by "optimizing" it beyond recognition because of strict aliasing or some other nonsense.

      • convolvatron 23 minutes ago

        you can certainly wrap the array with a structure which provides either bounds information to be checked with generic runtime functions, or specific function pointers (methods) to get and set.

        you can paper over _alot_ of Cs faults. ultimately its not really worth it, but its not nearly as fragile and arduous as you make it out to be

  • WalterBright 12 minutes ago

    > I’ve long been employing the length+data string struct. If there was one thing I could go back and time to change about the C language, it would be removal of the null-terminated string.

    It's not necessary to go back in time. I proposed a way to do it in modern C - no existing code would break:

    https://www.digitalmars.com/articles/C-biggest-mistake.html

    It's simple, and easy to implement.

  • canpan an hour ago

    Regarding memory, I recently changed to try to not use dynamic memory, or if I need to, to do it once at startup. Often static memory on startup is sufficient.

    Instead use the stack much more and have a limit on how much data the program can handle fixed on startup. It adds the need to think what happens if your system runs out of memory.

    Like OP said, it's not a solution for all types of programs. But it makes for very stable software with known and easily tested error states. Also adds a bit of fun in figuring out how to do it.

    • vbezhenar an hour ago

      In recent years I had to write some firmware code with C and that was exactly the approach I took. So far I never had need for any dynamic memory and I was surprised how far I can get without it.

    • thisoneisreal an hour ago

      I've been looking into Ada recently and it has cool safety mechanisms to encourage this same kind of thing. It even allows you to dynamically allocate on the stack for many cases.

  • JamesTRexx an hour ago

    Two things I thought while reading the post: Why not typedef BitInt types for stricter size and accidental promotion control when typedeffing for easier names anyway? I came across a post mentioning using regular arrays instead of strings to avoid the null terminatorand off-by-one pitfalls.

    I still have a lot of conversion to do before I can try this in my hobby project, but these are interesting ideas.

  • skywalqer 2 hours ago

    Nice post, but the flashy thing on the side is pretty distracting. I liked the tuples and maybes.

    • smnplk 2 hours ago

      Not distracting at all, it feels nostalgic to me. Id rather have these flashy things than a million popups and registration forms following you around, which is basically the modern web. I hate it so much. This site is pure balsam for my soul.

      • Vedor 2 hours ago

        Both nostalgic and distracting for me.

  • jcalvinowens 22 minutes ago

      #if CHAR_BIT != 8
       #error "CHAR_BIT != 8"
      #endif
    
    In modern C you can use static_assert to make this a bit nicer.

      static_assert(CHAR_BIT == 8, "CHAR_BIT is not 8");
    
    ...although it would be a bit of a shame IMHO to add that reflexively in code that doesn't necessarily require it.

    https://en.cppreference.com/w/c/language/_Static_assert.html

  • sys_64738 an hour ago

    #define BEGIN {

    #define END }

    /* scream! */