LINUX.ORG.RU

Кто знает способ определить тип данных в условиях директив препроцессора?

 , ,


0

2

Допустим есть тип определенный оператором typedef, определение может быть разным. Есть ли способ в условиях директив препроцессора (#if/#ifdef и т.п.) определить что за тип стоит в определении, а точнее его размер?

p.s. c99.

★★★

Последнее исправление: normann (всего исправлений: 1)

Препроцессор ничего не знает про типы.

anonymous
()
Ответ на: let me google for you от Aswed

Меня не интересует sizeof в макросах, меня интересует отличить один тип от другого по размеру (можно, в принципе, и не по размеру).

normann ★★★
() автор топика
Последнее исправление: normann (всего исправлений: 1)
Ответ на: комментарий от normann

Ну там вообще писалось о том, что у плюсов есть механизм для static sizeof, а в си нет. Макросы в это не умеют. Ну и если ты найдешь такой sizeof для си то сможешь, проверить, так как в #if есть сравнения на равенство.

Aswed ★★★★★
()

Препроцессинг исходников.

i-rinat ★★★★★
()
Ответ на: let me google for you от Aswed

Дополнение для ./configure, чтобы не так как в вашем URL предложили компилять и запускать printf(«%d», sizeof(...)); что для cross-компиляции не подходит. Если вы более-менее в курсе сколько может быть значений того sizeof(), то можно делать пробные исходники с switch(sizeof(...)) и задавать case 1024: case sizeof(...): break; Как ругнётся на одинаковый case, так значить угадали с численным размером :)

vodz ★★★★★
()
Ответ на: комментарий от normann

Не, надо портабельно.

А «портабельно» (ТМ) в реальном мире — это не всегда то что «написал один раз, работает везде» — если нет поддержки со стороны языка чего-то странного, что очень хочется, то это чаще набор уникальных для каждой платформы костылей в #ifdef, или вообще снаружи — в компайлтайме и раньше всяко никто не отменял костыли из скриптов систем сборки для всего, что ты не сможешь сделать препроцессором. Но для точного товета на этот вопрос ИТТ надо определиться с кругом платформ, конпеляторов и системой сборки.

slackwarrior ★★★★★
()

Препроцессору плевать на твои типы.

Запускай тестирование перед тем(чтобы как раз определить размер), как начинать сборку, а потом передавай компилятору через -D результат.

a1batross ★★★★★
()
Ответ на: комментарий от slackwarrior

Всё так, но ТС вроде и делает эти самые #ifdef-ы и ищет способы чтобы напрягаться меньше. :)

vodz ★★★★★
()

Можно так, например:

switch (sizeof(type)) {
case 1: 
case 2:
case 4:
}
Это, конечно, не препроцессор, но часто этого бывает достаточно. Если нет, то определять размер на этапе configure.

Sorcerer ★★★★★
()

Придется определять тип под условиями препроцессора.

normann ★★★
() автор топика
Ответ на: комментарий от Aswed

sizeof ни о чём не говорит. sizeof * CHAR_BIT - что-то уже может говорить. А так - обмазывайся #ifdef под каждый компилятор и платформу, которые ты собираешься поддерживать.

dzidzitop ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.