Мне нужно проверить, не указана ли указатель void в 8 байтах, поэтому я проверяю, равна ли его длине 4 или 8. Я знаю только эти значения, я могу использовать _W64
, просто любопытный чек.проверить размер указателя void в макросе c
#include <windows.h>
#if (sizeof(void *) == 4)
#define IS64 0
#elif (sizeof(void *) == 8)
#define IS64 1
#else
#error "Pointer size 4 nor 8, make changes in app"
#endif
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int cmdShow)
{
if (IS64) MessageBoxA(NULL, "is 64", "info", MB_OK);
else MessageBoxA(NULL, "is 32", "info", MB_OK);
return(0);
}
Этот код не работает, я получил ошибку app.c(2) : fatal error C1017: invalid integer constant expression
Я изменил макрос:
#if (sizeof(void *) == sizeof(int32_t))
#define IS64 0
#elif (sizeof(void *) == sizeof(int64_t))
#define IS64 1
#else
#error "Pointer size 4 nor 8, make changes in app"
#endif
ту же ошибку. Какие-нибудь обходные пути здесь?
'#define IS64 (sizeof (void *) == 8)' – WhozCraig
@WhozCraig - это хороший макрос и хороший обходной путь. Я подозреваю, что он хотел условное выражение препроцессора, что это недопустимо, поскольку sizeof не может быть явно понят препроцессором. – Jekyll
@Jekyll конечно, и, следовательно, это в комментариях, а не в ответе. Я не понимаю, почему он не просто использует предопределенные MS-файлы, но я уверен, что есть причина. О, подожди, сказал он, было просто любопытно, почему это не сработало. nm = P – WhozCraig