Есть код на си (расширение для php). Мне надо в нём понять, под какую сборку его компилируют: 32 или 64 бита. Желательно конечно макросом, чтобы было 2 ветки: одна выполнялась на 64х, вторая на 32х битах. Но если нельзя макросами, то хотя бы в рантайме. Выполняется под linux (debian). Хотя желательно максимально общее решение.
После копания в исходниках zend api нашёлся файл zend_long.h, а в нём определитель ZEND_ENABLE_ZVAL_LONG64, который как раз отвечает за разрядность целых чисел в пхп. Поэтому макрос такой: #ifdef ZEND_ENABLE_ZVAL_LONG64.
Если интересует рантайм-версия, то вот самый простой вариант: sizeof(void*) - может быть равен 4 или 8 :)
Но, если не секрет, в чем именно отличие этих двух веток? Мне во всех моих проектах хватало исключительно правильной расстановки типов size_t и ptrdiff_t, и ни разу не пришлось прибегать к явному определению разрядности.
Это расширение для работы с тарантулом, (тут код https://github.com/tarantool/tarantool-php/blob/st... ) там есть вот такое: add_next_index_long(tuple, i64_val); . При выполнении на моём 32 разрядном сервере оно просто отрезает половину разрядов и в скрипт попадает половинка от нужного числа. Выше я написал как исправил. Хотя с воидом тоже интересный вариант.
mayorovp: да, это я, там мой пул реквест. Если коротко - там когда из тарантула ответ приходит мне он нужен в виде строки, но строки в 4 и 8 байт расширение считают числами (просто тупо сравнивается длина в том свиче), хотя у меня это строки. Я знаю, что считать 64 битный инт строкой будет не всегда корректно, но это лучше чем сейчас, когда данные просто теряются.
drVatman: Зря вы это знаете :) Никого ведь не удивляет, что короткие строки считаются числами? Так что считать число строкой также абсолютно корректно.