Какая хорошая альтернатива uint8_t, если она не предоставлена ​​компилятором? - PullRequest
4 голосов
/ 16 ноября 2010

Я использую nvcc для компиляции ядра CUDA. К сожалению, nvcc не поддерживает uint8_t, хотя поддерживает int8_t (!). Я бы просто не стал использовать unsigned char из-за переносимости, читаемости и здравомыслия. Есть ли другая хорошая альтернатива?


Просто, чтобы предотвратить возможное недоразумение, вот некоторые детали.

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2010 NVIDIA Corporation
Built on Mon_Jun__7_18:56:31_PDT_2010
Cuda compilation tools, release 3.1, V0.2.1221

Код, содержащий

int8_t test = 0;

нормально, но код, содержащий

uint8_t test = 0;

выдает сообщение об ошибке типа

test.cu(8): error: identifier "uint8_t" is undefined

Ответы [ 4 ]

20 голосов
/ 16 ноября 2010

Целочисленные типы C99 не «определены компилятором» - они определены в <stdint.h>.

Попробуйте:

#include <stdint.h>
1 голос
/ 16 ноября 2010

Это, кажется, компилируется просто с nvcc:

#include <stdint.h>

int main() {
    uint8_t x = 0;
    return (int) x;
}
1 голос
/ 16 ноября 2010

Это ничем не отличается от того, что использует Mac OS X:

typedef unsigned char uint8_t;

Что вы беспокоитесь о переносимости unsigned char?Если проблема заключается в том, что char может не представлять 8 бит памяти, тогда вы можете включить статическое утверждение в виде:

typedef int Assert8BitChar[(CHAR_BIT == 8)? 0 : -1];

Это приведет к ошибке компиляции при нарушении предположения.

1 голос
/ 16 ноября 2010
typedef unsigned char uint8_t;
...