[Си] узнать sizeof(type) на стадии препроцессирования

disna

предлагайте свои варианты

Ivan8209

Если у тебя есть доступ к suxx, то почти наверняка есть и autosuxx.
---
...Я работаю антинаучным аферистом...

Realist

Имхо, никак. Размер типа — фича самого языка, а не препроцессора. Мб имеется в виду, на стадии компиляции? Можно ли другим образом сформулировать задачу, ибо пока непонятно, а нафига это все надо?

Ivan8209

> а нафига это все надо?
Затем, что в сях нет вычислений при компиляции,
из-за чего всё, что "const" на самом деле просто лежит в другой области памяти,
а не какие-то постоянные величины, которые можно использовать,
например, при задании размера массива и т.п.
---
"Narrowness of experience leads to narrowness of imagination."

disna

например, нужно знать, когда sizeof(long) != 4
я могу написать так
#if defined(__x86_64__)
#define SIZEOF_LONG 8
#else
#define SIZEOF_LONG 4
#endif

интересуют более элегантные способы

pitrik2

а зачем нужно узнать сайз оф лонг?
именно на стадии препроцессирования

kokoc88

интересуют более элегантные способы
 
#define SIZEOF_LONG sizeof(long)
Только это не препроцессирование... А зачем именно при препроцессинге?

banderon

Если препроцессинг можно отделить от компилирования, то узнать невозможно.
Простой пример: sizeof(long) может быть как 4, так и 8 в зависимости от (опций) компилятора.

disna

хочешь сказать, надо писать так:
if (sizeof(long) != 4) {
...
} else {
...
}

kokoc88

хочешь сказать, надо писать так
В твоём случае, видимо, именно так. Но если ты всё-таки опишешь задачу более детально, то, возможно, тебе предложат более красивый способ решения.
Кстати, при оптимизации заведомо ложные пути в ифах удаляются.

banderon

Да, если тебе именно такой смысл и нужен, то так и сделай.
А потом сравни генерируемый ассемблерный код. Правильный компилятор все сделает как надо
А на самом деле скажи-ка лучше для чего тебе это понадобилось?

disna

А потом сравни генерируемый ассемблерный код. Правильный компилятор все сделает как надо
действительно

Ivan8209

Чтобы не делать этого во время исполнения,
потому что условной компиляции в сях нет.
---
...Я работаю антинаучным аферистом...

Werdna

узнать sizeof(type) на стадии препроцессирования

бля, ты далбаёп?
препроцессинг ведь платформонезависимая вещь! О каком sizeof может идти речь?

Realist

Что значит "нет вычислений при компиляции"?
Действительно, фишка С++ в том, что можно закодировать любой алгоритм выполнится на стадии компиляции. В С такого нет.
С другой стороны компилятор С вправе вместо
  
i=5+6;

сгенерировать
  
i=11;

В этом смысле вычисления есть.
Думается, что компилятор вправе (если это возможно на этапе компиляции) вообще нигде не хранить constы, а сделать подстановки их значений.

Realist

Афаик, под условной компиляцией понимается применение директив
#ifdef и иже с ними.
В Сях эти директивы работают.
Повторюсь, что компилятор может делать любые оптимизации, которые не влияют на результат работы программы. В том числе подставлять конкретнее значения sizeof

Ivan8209

> Афаик, под условной компиляцией понимается применение директив
> #ifdef и иже с ними.
> В Сях эти директивы работают.
1. Это не директивы.
2. В сях их нет.
> Повторюсь, что компилятор может делать любые оптимизации,
> которые не влияют на результат работы программы.
Возьмём алгоритм Хафмена для подсчёта числа разрядов
или соответствующий для подсчёта чётности (она же CRC-1).
Сможешь объяснить, каким образом компилятор должен догадаться, как ему это оптимизировать?
Более сложный пример: линейный конгруентный ГПСЧ.
---
...Я работаю антинаучным аферистом...

bobby

Возьмём алгоритм Хафмена для подсчёта числа разрядов
или соответствующий для подсчёта чётности (она же CRC-1).
Сможешь объяснить, каким образом компилятор должен догадаться, как ему это оптимизировать?
Если не догадается, не соптимизирует.

Ivan8209

> Если не догадается, не соптимизирует.
И поэтому надо писать с расчётом на 128 разрядов?
---
...Я работаю антинаучным аферистом...

Elina74

К чему такая контрина любовь к обобщениям в тех местах, когда они не нужны и даже вредны?

bobby

От меня-то чего надо?

mira-bella

[Си] узнать sizeof(type) на стадии препроцессирования
юзать константы из <limits.h>

Ivan8209

В сях запретили объявлять свои типы?
---
...Я работаю антинаучным аферистом...

mira-bella

В сях запретили объявлять свои типы?
нет
но если обратить внимание на содержание треда, можно заметить, что задача в выяснении sizeof(long).

disna

на самом деле, нужно было выяснить размер базовых типов

Werdna

на самом деле, нужно было выяснить размер базовых типов

Ну да, sys/types.h у дрочеров не в моде.

alexkravchuk

Для крупной программы можно реализовать двухпроходной метод.
Создаётся небольшая программа, которая генерирует .h файл с основными #define, например вида
#define SIZEOF_MY_TYPE 36
#define SIZEOF_MY_TYPE_IS_MORE_36 1
эта программа включается в make-файл, а основной код использует сгенерированный заголовочный файл. Немного громоздко, но зато достаточно гибкое решение, которое много позволит удобного реализовать, на что C-препроцессор не способен, или шаблоны у C++.

amkharchenko

Вычисления, кстати, по-крайней мере, в gcc есть вплоть до замены strlen("hello") на 5.

Ivan8209

> Вычисления, кстати, по-крайней мере, в 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 ) ;

---
...Я работаю антинаучным аферистом...

amkharchenko

Пиздуй обратно в волшебный мир графов и предикатов.

alexkravchuk

ничто этому, по идее, не мешает. Если оптимизатор видит, что фунция не использует переменных кроме тех, что передаются через аргументы (то есть нет статических/глобальных или вызовов функций то он вполне может подставить вычисленное значение, и на практике, в каких-то случаях подставляет.

Ivan8209

> фунция не использует переменных кроме тех, что передаются через аргументы
Здесь функция использует глобальную или статическую предвычисленную таблицу.
Либо по сотне раз перевычисляет одно и то же.
То есть, твой оптимизатор должен увидеть, что перевычисляется одно и то же,
и самостоятельно, без вмешательства постороннего разума создать таблицу.
Довольно сильный оптимизатор, однако!
---
...Я работаю антинаучным аферистом...

erotic

+1 за этот метод

Ivan8209


fgrep -n main /path/to/any/configure

---
"Аллах не ведёт людей неверных."

erotic

Да низвергнется на тебя ./preconf
Оставить комментарий
Имя или ник:
Комментарий: