home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c      Meh, in C you gotta define EVERYTHING      243,242 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 243,155 of 243,242   
   Keith Thompson to David Brown   
   Re: printf and time_t   
   05 Feb 26 11:22:24   
   
   From: Keith.S.Thompson+u@gmail.com   
      
   David Brown  writes:   
   > On 05/02/2026 00:52, Bart wrote:   
   >> On 04/02/2026 23:39, Keith Thompson wrote:   
   >>> Bart  writes:   
   >>> [...]   
   >>>> The problem is that C expects an exact format-code when trying to use   
   >>>> *printf functions, and for that you need to know the exact types of   
   >>>> the expressions being passed. For example:   
   >>>>   
   >>>>    uintptr_t x;                    // from above   
   examples   
   >>>>    double y;                       //   
   >>>>    printf("x * y is %?", x * y);   // What's '?'   
   >>>   
   >>> Since you asked...   
   >>>   
   >>> '?' is 'f' (or 'g' or 'e', or 'a', or any of those in upper case).   
   >>> `x * y` is of type double.   
   >>   
   >> The 'from above examples' applies to both x and y. That means that   
   >> 'double' /may/ have been redefined like this (from my post):   
   >>   
   >>    #ifdef SQLITE_OMIT_FLOATING_POINT   
   >>    # define double sqlite3_int64   
   >>    #endif   
   >>   
   >> I don't know what 'sqlite3_int64' is, but it sounds like a signed   
   >> integer.  I was asked to give examples of conditional types, and   
   >> thought it best to do so from actual programs.   
   >   
   > What you have found is an idiocy in SQLITE, not a problem in the C   
   > language or printf.  If the macro "SQLITE_OMIT_FLOATING_POINT" is   
   > defined, then the type named "sqlite3_int64" is not an integer type,   
   > nor can it hold arbitrary 64-bit integers (as Michael S pointed out,   
   > and I assume accurately, it can hold 53 bit integers).  I do not know   
   > what this type is used for in the code, but something like   
   > "sqlite3_bignum" would be a far better choice of name.  And if it is   
   > intended that people print out these values directly, defining   
   > "PRsqlite3_bignum" to "%g" or "%llu" as appropriate would be helpful.   
   > (Yes, the resulting printf statements would be ugly - better ugly and   
   > correct than wrong).   
      
   The macro doesn't define "sqlite3_int64", which as far as I can tell is   
   always an integer type.  It redefines "double".   
      
   That macro in isolation does seem deeply silly, but I haven't worked on   
   sqlite3's source code.  Apparently the authors found it convenient.   
   Presumably anyone working on the source code has to keep in mind that   
   the word "double" doesn't necessarily mean what it normally means.  It's   
   not the way I would have written it.  I probably would have defined a   
   type name that can be either "double" or "sqlite3_int64", depending on   
   the setting of SQLITE_OMIT_FLOATING_POINT.  But I don't know enough   
   about the sqlite3 source code to be able to meaningfully criticize it.   
      
   In almost all contexts, it's perfectly reasonable to assume that the   
   word "double" in C code refers to the predefined floating-point type.   
      
   --   
   Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com   
   void Void(void) { Void(); } /* The recursive call of the void */   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca