Author: Heiner Marxen
Date: 14:29:28 01/11/03
Go up one level in this thread
On January 10, 2003 at 21:34:38, Robert Hyatt wrote: >On January 10, 2003 at 18:14:09, Miguel A. Ballicora wrote: [...] >>If you want portable code, use long long for both. If it is a very important >>variable use typedef. That often is not a good solution. Memory is not exactly for free, especially not so in the caches. Also (long long) is not exactly portable, either. >By that logic, all that would be safe to use is "long long" which is, in itself, >a problem. If I only need values that fit in 32 bits, I want to be able to use >32 bits, and the same for 64 bits... I want to be able to say what I need, >and then let the compiler complain if it can't deliver that. Which will let >me know I have a problem, rather than the present scheme of the compiler >assuming something that very well could be wrong... In a direct sense you are quite right: C does not provide a portable solution for this. "this" being (as I understand it): I want an integral type of at least N bits. N a (compile time) constant. [ If you want types with an exact number of bits, that is even harder, since the platform/compiler may not have that exact size. ] But one can solve the problem at least partially. I've done so for Chest. It is about portability of the source code (porting binaries is a completely different topic), and hence I assume a target platform with a compiler. Additionally I assume that we can execute (run) a C program at the same platform where we compile it (not a cross compile). Then I figured, that I _can_ find out the exact bit size of a type like unsigned char unsigned short unsigned int unsigned long at _run time_. Well, that does not solve my problem immediately, but it helps... I wrote a small portable program, that at its run time computes the bit sizes that fit into the above four unsigned types. It then does four printf's like: printf("#define BITS_IN_UNSIGNED_CHAR %d\n", bits_in_unsigned_char); It also determines the first of these 4 types, that has bit size at least 8/16/32, and does an appropriate printf(): printf("typedef unsigned %s uint32\n", ...); This program is compiled, and run. Its output is stored into a file named "lcltyp.h". ( All this can be done from the makefile ) Now preparation is complete, and the rest of the program sources include that (locally computed, not distributed) "lcltyp.h". Now I can use any kind of stuff (typedefs, #define's) from the computed header, as if that would be a portable way to say it to the C compiler. As if C would know by itself. In a way I've added some introspection capabilities, which (sadly) are missing from C itself. [ I do not know whether C99 solves some of these issues, I refer to C90 ] Cheers, Heiner
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.