[Си] узнать sizeof(type) на стадии препроцессирования
---
...Я работаю антинаучным аферистом...
Имхо, никак. Размер типа — фича самого языка, а не препроцессора. Мб имеется в виду, на стадии компиляции? Можно ли другим образом сформулировать задачу, ибо пока непонятно, а нафига это все надо?
Затем, что в сях нет вычислений при компиляции,
из-за чего всё, что "const" на самом деле просто лежит в другой области памяти,
а не какие-то постоянные величины, которые можно использовать,
например, при задании размера массива и т.п.
---
"Narrowness of experience leads to narrowness of imagination."
я могу написать так
#if defined(__x86_64__)
#define SIZEOF_LONG 8
#else
#define SIZEOF_LONG 4
#endif
интересуют более элегантные способы
именно на стадии препроцессирования
интересуют более элегантные способы
![](/images/graemlins/crazy.gif)
![](/images/graemlins/confused.gif)
#define SIZEOF_LONG sizeof(long)
Только это не препроцессирование... А зачем именно при препроцессинге?
Простой пример: sizeof(long) может быть как 4, так и 8 в зависимости от (опций) компилятора.
if (sizeof(long) != 4) {
...
} else {
...
}
хочешь сказать, надо писать такВ твоём случае, видимо, именно так. Но если ты всё-таки опишешь задачу более детально, то, возможно, тебе предложат более красивый способ решения.
Кстати, при оптимизации заведомо ложные пути в ифах удаляются.
А потом сравни генерируемый ассемблерный код. Правильный компилятор все сделает как надо
![](/images/graemlins/smirk.gif)
А на самом деле скажи-ка лучше для чего тебе это понадобилось?
А потом сравни генерируемый ассемблерный код. Правильный компилятор все сделает как надодействительно
![](/images/graemlins/smile.gif)
![](/images/graemlins/cool.gif)
потому что условной компиляции в сях нет.
---
...Я работаю антинаучным аферистом...
узнать sizeof(type) на стадии препроцессирования
бля, ты далбаёп?
препроцессинг ведь платформонезависимая вещь! О каком sizeof может идти речь?
Действительно, фишка С++ в том, что можно закодировать любой алгоритм выполнится на стадии компиляции. В С такого нет.
С другой стороны компилятор С вправе вместо
i=5+6;
сгенерировать
i=11;
В этом смысле вычисления есть.
Думается, что компилятор вправе (если это возможно на этапе компиляции) вообще нигде не хранить constы, а сделать подстановки их значений.
#ifdef и иже с ними.
В Сях эти директивы работают.
Повторюсь, что компилятор может делать любые оптимизации, которые не влияют на результат работы программы. В том числе подставлять конкретнее значения sizeof
> #ifdef и иже с ними.
> В Сях эти директивы работают.
1. Это не директивы.
2. В сях их нет.
> Повторюсь, что компилятор может делать любые оптимизации,
> которые не влияют на результат работы программы.
Возьмём алгоритм Хафмена для подсчёта числа разрядов
или соответствующий для подсчёта чётности (она же CRC-1).
Сможешь объяснить, каким образом компилятор должен догадаться, как ему это оптимизировать?
Более сложный пример: линейный конгруентный ГПСЧ.
---
...Я работаю антинаучным аферистом...
Возьмём алгоритм Хафмена для подсчёта числа разрядовЕсли не догадается, не соптимизирует.
или соответствующий для подсчёта чётности (она же CRC-1).
Сможешь объяснить, каким образом компилятор должен догадаться, как ему это оптимизировать?
И поэтому надо писать с расчётом на 128 разрядов?
---
...Я работаю антинаучным аферистом...
К чему такая контрина любовь к обобщениям в тех местах, когда они не нужны и даже вредны?
От меня-то чего надо?
[Си] узнать sizeof(type) на стадии препроцессированияюзать константы из <limits.h>
---
...Я работаю антинаучным аферистом...
В сях запретили объявлять свои типы?нет
но если обратить внимание на содержание треда, можно заметить, что задача в выяснении sizeof(long).
на самом деле, нужно было выяснить размер базовых типов
на самом деле, нужно было выяснить размер базовых типов
Ну да, sys/types.h у дрочеров не в моде.
![](/images/graemlins/crazy.gif)
Создаётся небольшая программа, которая генерирует .h файл с основными #define, например вида
#define SIZEOF_MY_TYPE 36
#define SIZEOF_MY_TYPE_IS_MORE_36 1
эта программа включается в make-файл, а основной код использует сгенерированный заголовочный файл. Немного громоздко, но зато достаточно гибкое решение, которое много позволит удобного реализовать, на что C-препроцессор не способен, или шаблоны у C++.
Вычисления, кстати, по-крайней мере, в gcc есть вплоть до замены strlen("hello") на 5.
Ну, допустим, таблицу CRC-32 для всех октетов я смогу за один запуск cc(1) создать?
По образу и подобию такого:
create crc-table 256 cells allot
marker precalc
: crc ... ;
: fill-crc-table 256 0 do i crc crc-table i th ! loop ;
fill-crc-table precalc
: crc ... ( Тут можно использовать сделанную crc-table ) ;
---
...Я работаю антинаучным аферистом...
Пиздуй обратно в волшебный мир графов и предикатов.
ничто этому, по идее, не мешает. Если оптимизатор видит, что фунция не использует переменных кроме тех, что передаются через аргументы (то есть нет статических/глобальных или вызовов функций то он вполне может подставить вычисленное значение, и на практике, в каких-то случаях подставляет.
Здесь функция использует глобальную или статическую предвычисленную таблицу.
Либо по сотне раз перевычисляет одно и то же.
То есть, твой оптимизатор должен увидеть, что перевычисляется одно и то же,
и самостоятельно, без вмешательства постороннего разума создать таблицу.
Довольно сильный оптимизатор, однако!
---
...Я работаю антинаучным аферистом...
+1 за этот метод
fgrep -n main /path/to/any/configure
---
"Аллах не ведёт людей неверных."
Да низвергнется на тебя ./preconf
Оставить комментарий
disna
предлагайте свои варианты