• Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

We're also offering banner ads on our site from just \$5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.

### #ActualÁlvaro

Posted 22 May 2013 - 08:40 AM

Just as an addition, I always prefer using the C99 header stdint.h (also available as cstdint in C++) and the types uint8_t and similar and not handling this mess myself. In one company I worked for, this was not done and during a switch to 64 bit I had to update a whole bunch of header files with lots of #ifdefs to take care of this. Had the project used stdint, it would have saved me a whole day of debugging to find the problem and fix it.

I agree that stdint.h should be used, but before that was available I used to write a little program that would check the size of various integer types (using sizeof) and produce the text of a header file with those typedefs. The makefile knew to compile and run this program to generate the header file. I used that without problems for years.

#include <iostream>
#include <string>
#include <climits>
#include <cstdlib>

std::string find_type(int size) {
if (CHAR_BIT * sizeof(char) == size) return "char";
if (CHAR_BIT * sizeof(short) == size) return "short";
if (CHAR_BIT * sizeof(int) == size) return "int";
if (CHAR_BIT * sizeof(long) == size) return "long";
if (CHAR_BIT * sizeof(long long) == size) return "long long"; // OK in gcc
std::cerr << "ERROR: I couldn't find a " << size << "-bit type!\n";
std::exit(1);
}

void define_signed_and_unsigned(int size) {
std::cout << "typedef signed " << find_type(size) << " int" << size << ";\n";
std::cout << "typedef unsigned " << find_type(size) << " uint" << size << ";\n";
}

int main() {
define_signed_and_unsigned(8);
define_signed_and_unsigned(16);
define_signed_and_unsigned(32);
define_signed_and_unsigned(64);
}



### #1Álvaro

Posted 22 May 2013 - 08:30 AM

Just as an addition, I always prefer using the C99 header stdint.h (also available as cstdint in C++) and the types uint8_t and similar and not handling this mess myself. In one company I worked for, this was not done and during a switch to 64 bit I had to update a whole bunch of header files with lots of #ifdefs to take care of this. Had the project used stdint, it would have saved me a whole day of debugging to find the problem and fix it.

I agree that stdint.h should be used, but before that was available I used to write a little program that would check the size of various integer types (using sizeof) and produce the text of a header file with those typedefs. The makefile knew to compile and run this program to generate the header file. I used that without problems for years.

#include <iostream>
#include <string>
#include <climits>
#include <cstdlib>

std::string find_type(int size) {
if (CHAR_BIT * sizeof(char) == size) return "char";
if (CHAR_BIT * sizeof(short) == size) return "short";
if (CHAR_BIT * sizeof(int) == size) return "int";
if (CHAR_BIT * sizeof(long) == size) return "long";
if (CHAR_BIT * sizeof(long long) == size) return "long long"; // OK in gcc
std::cerr << "ERROR: I couldn't find a " << size << "-bit type!\n";
std::exit(1);
}

void define_signed_and_unsigned(int size) {
std::cout << "typedef signed " << find_type(size) << " int" << size << "\n";
std::cout << "typedef unsigned " << find_type(size) << " uint" << size << "\n";
}

int main() {
define_signed_and_unsigned(8);
define_signed_and_unsigned(16);
define_signed_and_unsigned(32);
define_signed_and_unsigned(64);
}



PARTNERS