I already know that stdint
is used to when you need specific variable sizes for portability between platforms. I don't really have such an issue for now, but what are the cons and pros of using it besides the already shown fact above?
Looking for this on stackoverflow and others sites, I found 2 links that treats about the theme:
codealias.info - this one talks about the portability of the stdint.
stackoverflow - this one is more specific about uint8_t.
These two links are great specially if one is looking to know more about the main reason of this header - portability. But for me, what I like most about it is that I think uint8_t
is cleaner than unsigned char
(for storing an RBG channel value for example), int32_t
looks more meaningful than simply int
, etc.
So, my question is, exactly what are the cons and pros of using stdint
besides the portability? Should I use it just in some specifics parts of my code, or everywhere? if everywhere, how can I use functions like atoi()
, strtok()
, etc. with it?
Thanks!
Using well-defined types makes the code far easier and safer to port, as you won't get any surprises when for example one machine interprets int
as 16-bit and another as 32-bit. With stdint.h, what you type is what you get.
Using int
etc also makes it hard to detect dangerous type promotions.
Another advantage is that by using int8_t
instead of char
, you know that you always get a signed 8 bit variable. char
can be signed or unsigned, it is implementation-defined behavior and varies between compilers. Therefore, the default char
is plain dangerous to use in code that should be portable.
If you want to give the compiler hints of that a variable should be optimized, you can use the uint_fastx_t
which tells the compiler to use the fastest possible integer type, at least as large as 'x'. Most of the time this doesn't matter, the compiler is smart enough to make optimizations on type sizes no matter what you have typed in. Between sequence points, the compiler can implicitly change the type to another one than specified, as long as it doesn't affect the result.
None.
Reference: MISRA-C:2004 rule 6.3."typedefs that indicate size and signedness shall be used in place of the basic types".
EDIT : Removed incorrect example.