Когда я реализовал макрос на HLSL в проекте Unity, я столкнулся со странной проблемой.
#define read(name) read2(TYPEOF(name), name)
#define TYPEOF(name) typeof_ ## name
#define read2(t, name) TYPEOF_READ(t, name)
#define TYPEOF_READ(a, b) a ## _read(b)
#define typeof_X float
read(X);
Я ожидал, что это расширится, как показано ниже.
float_read(X);
Но Unity говорит
Необъявленный идентификатор 'typeof_X_read'.
Существуют ли различия в реализации между препроцессором HLSL/Cg и обычным C? Конечно проверил
gcc -E
работает, как я и ожидал.
>> вставленные токены должны быть действительными токенами. Это вызывает такую разницу? Я не могу понять, что означает «действительный» в контексте.
Недопустимый токен в ссылке:
x4
. Однако в вашем случае я не вижу недействительных токенов. Похоже, он просто не улавливает, чтоtypeof_X
был определен какfloat
. Возможно, это ошибка компилятора (в зависимости от карты, графического драйвера и версии DirectX).Это действительно похоже на ошибку компилятора, которая, в свою очередь, может быть комбинацией вашей карты, графического драйвера и версии DirectX. Вы можете протестировать свой код здесь: tryhlsl.azurewebsites.net