директивы условной компиляции

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

Модератор: Модераторы

Bohdan
новенький
Сообщения: 87
Зарегистрирован: 11.05.2005 11:31:46
Откуда: Ukraine, Kyiv
Контактная информация:

Сообщение Bohdan »

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


Помоему обсуждение к сожалению ушло в сторону от первоначальной темы... Хотелось бы вернуться к обсуждению "ИДЕАЛЬНОГО ЯЗЫКА"

Вот кто подскажет, что делать с директивами условной компиляции?
Согласитесь что она значительно ухудшает читабельность программы, но без нее сейчас не обходиться ни один кросс-платформенный проект.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Bohdan писал(а):Вот кто подскажет, что делать с директивами условной компиляции?

По момему пока с ними миряимся, как с необходимым злом - но желательно использовать их как можно меньше.
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

Подскажите, пожалуйста, директивы условной компиляции (если оини существуют) для QT и GTK/GTK2.
Что-то у меня ничего не получается.

Добавлено спустя 1 час 45 минут 13 секунд:
Разобрался...
LCLgtk, LCLgtk2, LCLqt, LCLfpgui, LCLwin32, LCLwinse, LCLcarbon.
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

Прошу прощения, что поднимаю старую тему, но не смог сдержатся.
Мне кажется что директивы условной компиляции необходимо вообще убрать из "идеального языка".
То для чего они используются необходимо писать на самом языке:

Код: Выделить всё

const Platform: String = 'Win64';
 ...
if (Platform = 'Win32') then begin
 ...
end else begin
  ...
end;

А вырезать неосуществимые ветви должен компилятор
Или располагать платформозависимые модули в отдельных папках как сейчас лежат откомпилированные. win32-i386, FreeBSD-x86_64 и т.д.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Каждый должен заниматься своим делом!
Препроцессор обрабатывать директивы, а компилятор соответственно компилировать... :wink:
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

Препроцесоры это вообще наносное. Компилировать должен компилятор. IMHO.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

AbakAngelSoft писал(а):То для чего они используются необходимо писать на самом языке:

Код: Выделить всё
const Platform: String = 'Win64';
...
if (Platform = 'Win32') then begin
...
end else begin
...
end;

А как быть с условными объявлениями (переменных, типов, функций, констант)?
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

Код: Выделить всё

unit ...;
...
const Platform: String = 'Win64';
...
type
if (Platform = 'Win32') then begin
  TMyType = class(TWin32Class)
  ...
  end;
end else begin
  TMyType = class(TWin64Class)
  ...
  end;
end;
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

И сколько чудесных багов принесет такое "усовершенствование" синтаксиса...
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

Какие баги это может принести?
наоборот компилятор сможет бить по рукам в случаях неправильного использования директив!
А то сейчас необходимо пробовать компилировать при всех возможных сочетаниях что бы быть уверенным что директивы использованы правильно!

Код: Выделить всё

{#IFDEF MyDEF}
 type t = class(TObject);
{#ENDIF}
...
 var c: t;

Если директива определена компилируется нормально и даже без предупреждений, а код-то неправильный!
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Да утопия это. В том и преимущество препроцессора, что он вообще не парсит, ветки, которые не попадают под условие. Они может и не должны компилироваться, скажем программа под разные платформы, меня интересует только одна, а под остальные у меня нет библиотек.
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

Не утопия!
Причем тут библиотеки?
Компилируется только код под текущую платформу, а анализируется весь, чтобы вовремя по рукам дать.
Мы же говорим о "идеальном языке" :)
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Ну так, в вышеприведенном примере с неопределенным типом "t" она должна "по рукам дать", или нет?
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

обязательно. Если код при некоторых условиях может вызывать ошибки компилятор должен об этом открыто говорить
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Ok. А в таком варианте:

Код: Выделить всё

const Platform: String = 'XXX';

uses
  if Platform = 'XXX' then
    XXXTypes;
  else
    YYYTypes;
  end;

if Patform = 'XXX' then
  type
     TSomeType = integer;
end;

var
  A :TSomeType;


YYYTypes у меня нет, я работаю на платформе XXX. Как разрулить?
Ответить