Thread

  1. Re: Safer hash table initialization macro

    Thomas Munro <thomas.munro@gmail.com> — 2025-12-06T00:56:32Z

    On Sat, Dec 6, 2025 at 3:32 AM Jelte Fennema-Nio <postgres@jeltef.nl> wrote:
    > On Fri, 5 Dec 2025 at 02:30, Thomas Munro <thomas.munro@gmail.com> wrote:
    > > How much of our header stuff is supposed to work from C++ too?
    >
    > I think it's nice if it works, but it doesn't seem the most important.
    > Especially since C++ has its own hashmaps. And if it really needs to
    > create a hashmap it's still possible to call the.
    
    ... C functions without the helper macros.  Yeah.  That seems OK to me.
    
    > > I suppose you could
    > > write the typeof-based version you already hinted at, but only use it
    > > for __cplusplus__ (where typeof exists as decltype).
    >
    > I tried to figure something out that would work in C++ (with help of
    > Claude), but I wasn't able to create a version of the macros without
    > also needing to add:
    >
    > #ifdef __cplusplus
    > }
    > #include <type_traits>
    > extern "C" {
    > #endif
    >
    > It seems quite ugly to escape the extern "C" from the parent like that
    > and then re-enter it. Overall it doesn't seem worth the hassle to me
    > to make these macros work in C++.
    
    Yeah.  I don't think we want that sort of thing all over the place.
    We could eventually come up with a small set of tools in a central
    place though, so people can work with this stuff without also known
    C++ meta-programming voodoo.  For example something like (untested, I
    didn't think about char[size], just spitballing here...):
    
    (pg_expr_has_type_p(ptr, char *) || pg_expr_has_type_p(ptr, NameData *))
    
    ... given the definition I posted recently[1].
    
    I take your point that it's not really important for this case though.
    
    > > Another consideration is what impact we have on the Rust world, and
    > > potentially other languages used for extensions that call C via FFI
    > > etc
    >
    > FFI generally cannot call macros anyway, only actual symbols.
    
    Sure, I was just thinking about how such cross-language usage would be
    forced to unpick our macrology and call the underlying C functions
    without them.  Doesn't seem like the end of the world anyway, I was
    just thinking out loud about the consequences of this phenomenon in
    headers.
    
    [1] https://www.postgresql.org/message-id/CA+hUKGL7trhWiJ4qxpksBztMMTWDyPnP1QN+Lq341V7QL775DA@mail.gmail.com