C ++替代BYTE C宏

时间:2011-05-02 11:03:44

标签: c++ c

我正在尝试移植此处找到的C openGL纹理加载代码:  http://www.nullterminator.net/gltexture.html 到C ++。特别是我正在尝试从文件中读取一些纹理,以惯用和可移植的方式重写以下代码的最佳方法是什么:

GLuint texture;
int width = 256, height = 256;
BYTE * data;
FILE * file;

// open texture data
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;

// allocate buffer
data = malloc( width * height * 3 );

// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );

特别是以可移植的c ++方式替换BYTE宏的最佳方法是什么?

编辑:在我正在使用的当前环境中没有定义BYTE宏。我试图弄清楚其他系统上的基础类型是什么,这样我就可以为正确的类型输入typede。

4 个答案:

答案 0 :(得分:3)

假设原始代码是可移植的,您可以保留它。请确保按原样引入BYTE的定义。 C ++编译器向后兼容C,因此相应的头文件仍在那里。

(如果BYTE真的是一个宏,我可能会typedef。)

答案 1 :(得分:2)

当编译为C ++时,C代码应该可以正常工作。

不要使用BYTE类型,只需使用OpenGL定义的类型GLbyte,这是API实际使用的类型。它在gl.h中定义:

typedef signed char GLbyte;

将上述代码快速(未经测试!)翻译成C ++就像是:

GLuint texture;
unsigned width = 256, height = 256;
unsigned buffer_size = width * height * 3;
GLbyte * data;
std::ifstream file;

// open texture data
file.open(filename, ios_base::in | ios_base::binary);
if (!file) return 0;

// allocate buffer
data = new BYTE[buffer_size];

// read texture data
file.read(data, buffer_size);
file.close();

// Process data...
// ...

// Don't forget to release it when you're done!
delete [] data;

答案 2 :(得分:0)

在这种情况下,BYTE *似乎只是char *或unsigned char *的宏。我错了,但我对此表示怀疑。因此在程序中使用char *或unsigned char *将是等效的。但是,如果要从C移植到C ++,可能需要考虑使用C ++标准库中的ifstream(以二进制模式)。

答案 3 :(得分:0)

使用unsigned char代替BYTE - 应按预期工作(您可能必须转换malloc()的返回值。