LINUX.ORG.RU

Столкнулся я с вашим шарпом...


0

2

... и в нём нет глобальных макросов. http://stackoverflow.com/questions/5149351/c-solution-wide-define
Как народ обычно добавляет фичи без макросов?
Т.е. в C я бы написал:

#if NEW_COOL_FEATURE
   <new code here>
#else
   <old working code here>
#endif

Или на шарпе сразу работающий код пишут?

Перемещено mono из talks

★★★★★

Там централизовано прописывается в зависимостях одна из 100500 версий фреймворка. А в каждой версии - стабильный набор NEW_COOL_FEATUREов.

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

это там есть. но определения можно дать через параметры компилятора.

dib2 ★★★★★
()

на шарпе сразу неработающий код пишут... а что-то кастрированое типа

#if DEBUG
   <debug code here>
#endif
всётаки имеется

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

В рантайме, да. Препроцессорными директивами, можно управлять тем, какие реализации будут зарегистрированы в application root приложения.

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

не засирая код препроцессорными директивами.
Препроцессорными директивами [...] какие реализации будут зарегистрированы

Эка тебе солнцем напекло...

cdshines ★★★★★
()

Эпичненько... mono перенёс тему о mono...

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

Ну как я понял, ТС собрался код реализаций в них заворачивать. Проблема в этом, а не в препроцессорных директивах.

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

Ну как я понял, ТС собрался код реализаций в них заворачивать. Проблема в этом, а не в препроцессорных директивах.

Я не совсем понял, о чём ты, ну да ладно... Вопрос был именно про директивы, чтобы с помощью них включить новую фичу.

UVV ★★★★★
() автор топика

нет глобальных макросов

ибо нефиг.

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

Это работает на этапе выполнения.

Ответ не верный. Это работает на этапе JIT компиляции. (Хотя по идее компилятор еще при компиляции с CIL может все лишнее вырезать, может уже и тогда сразу вырежет все).

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

Удаляешь старый не нужный код и оставляешь только новый. Зачем разводить бардак в исходниках?

invy ★★★★★
()

не с нашим, а с вашим.

u283
()
#if NEW_COOL_FEATURE
   <new code here>
#else
   <old working code here>
#endif

git branch new_cool_feature

BlackHawk
()
Последнее исправление: BlackHawk (всего исправлений: 2)
Ответ на: комментарий от qrck

А чем не катит просто

old working code
working

к тому же возможна ситуация, когда new code не скомпилется ( ты это не описал)
//А вообще, макросы это не красиво.

comp00 ★★★★
()

Тред ушел в совершенно левые дебри. Задача топикстартера должна решаться при помощи средств типа частичных методов (partial method) или аттрибута Conditional

http://msdn.microsoft.com/ru-ru/library/4xssyw96(v=vs.90).aspx

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

разъясни плз, чем для шарпа это будет отличаться? По идее, если мы просто напишем if(x), где x - константа, компилятор выбросит ненужный кусок сразу же, не? До рантайма не дойдет, просадки в перфомансе не будет. Вместо этого предлагается делать именованный блок и навешивать на него адовую аннотацию - куча синтаксического мусора.

stevejobs ★★★★☆
()
Ответ на: комментарий от qrck

Ответ не верный. Это работает на этапе JIT компиляции.

JIT компиляция работает во время выполнения => ответ верный.

Deleted
()
Ответ на: комментарий от Deleted

JIT компиляция работает во время выполнения => ответ верный.

Только не в случае C# (да и любого другого .NET языка). JIT компиляция работает один раз, при первом запуске бинарника. Потом - скомпилированное кладется куда-то в assembly cache, и дергается напрямую оттуда, в уже собранном виде. Так что накладные расходы - почти нулевые. Ну и опять-же, скорее всего еще компилятор C# еще на этапе компиляции исходников, задолго до JIT, вырежет мертвые ветки кода. Всякие Скотты Майерсы и прочие давно даже для C/C++ советуют использовать if вместо #ifdef, т.к. с ним проблем меньше. Единственное удобство в #ifdef в случае C/C++ - это то, что можно макросы через -D в командной строке задать.

qrck ★★
()

Как народ обычно добавляет фичи без макросов?

«Народ» обычно за макросы устраивает показательную порку, поскольку считается (и небезосновательно), что макросы вредят читабельности и сопровождаемости кода.

no-dashi ★★★★★
()
Ответ на: комментарий от qrck

Ну и опять-же, скорее всего еще компилятор C# еще на этапе компиляции исходников, задолго до JIT, вырежет мертвые ветки кода.

Я не понял. То есть если я напишу

if (0) {
   no_such_type x;
   undefined_function(x);
}

То это скомпилируется?

Всякие Скотты Майерсы и прочие давно даже для C/C++ советуют использовать if вместо #ifdef, т.к. с ним проблем меньше. Единственное удобство в #ifdef в случае C/C++ - это то, что можно макросы через -D в командной строке задать.

На C++

$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:4:8: error: ‘no_such_type’ was not declared in this scope
test.cpp:4:21: error: expected ‘;’ before ‘x’
test.cpp:5:27: error: ‘x’ was not declared in this scope
test.cpp:5:28: error: ‘undefined_function’ was not declared in this scope

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

Т.е. в C я бы написал:

А кто мешает на код шарпа предварительно cpp натравить? А ещё лучше, сразу m4.

monk ★★★★★
()

Или на шарпе сразу работающий код пишут?

Ага. Сразу неработающий.

Anon
()
Ответ на: комментарий от qrck

Единственное удобство в #ifdef в случае C/C++ - это то, что можно макросы через -D в командной строке задать.

В случае макросов препроцессор вырежет весь ненужный код до компиляции, удаче тебе ядро компилять (500 МB исходников) c твоими if (0) без макросов - компилятор каждый раз будет проверять корректность всего кода.

anonymous
()
Ответ на: комментарий от anonymous

В случае макросов препроцессор вырежет весь ненужный код до компиляции, удаче тебе ядро компилять (500 МB исходников) c твоими if (0) без макросов - компилятор каждый раз будет проверять корректность всего кода.

Предлагаю для начала изучить, как устроена система сборки ядра, что бы не писать впредь такую чушь. Не говоря уже о том, что сравнимый по размеру C# проект собирается куда быстрее, чем C++.

(Не надо думать, что я сторонник C#, - убогий язык. Но глупо отрицать очевидные факты, даже не смотря на нелюбовь к языку)

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

Я не понял. То есть если я напишу

if (0) { no_such_type x; undefined_function(x); }

То это скомпилируется?

Конечно нет, и это правильно.

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

Про make-файлы я из без дебилов знаю. А ты попробуй без макросов кроссплатформенные независимые от типов двусвязные списки, фифо, рабочие череди сделать на С.

anonymous
()
Ответ на: комментарий от qrck

Только не в случае C# (да и любого другого .NET языка). JIT компиляция работает один раз, при первом запуске бинарника.

Не может быть. Так ничего не наоптимизируешь, без PGO. Там кажется есть AOT компилятор, но это точно не дефолт.

Такое конает с нативным кодом, тем более там не тащат с собой компилирующий рантайм. Но при такой тупой компиляции управляемый код тормозил бы еще адовее. А так его спасает PGO, потому пол-кода, фреймворков и библиотек попросту выкашиваются из нативного образа

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

А ты попробуй без макросов кроссплатформенные независимые от типов двусвязные списки, фифо, рабочие череди сделать на С.

На самом деле легко, т.к. в C есть волшебный тип void* :) только вручную приводить типы прийдется каждый раз. Но вообще да, для именно C макросы порой бывают незаменимы, к счастью область применения C ограничена в основном ядром и эмбедщиной.

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

Не может быть. Так ничего не наоптимизируешь, без PGO. Там кажется есть AOT компилятор, но это точно не дефолт.

Возможно мы «оба правы». Просто по результатам выполнения программы и всех рантайм профайлингов, получается некий бинарь, рано или поздно. Оно и кешируется, что-бы в следующий раз не начинать с чистого листа. Но в какой-то форме оно точно кешируется, если верить учебникам по C#/.NET.

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

Не может быть.

Именно так все в .net и есть.

Но при такой тупой компиляции управляемый код тормозил бы еще адовее.

Ну не тормозит :)

anonymous
()
Ответ на: комментарий от anonymous

Это же отдельная утилита. Ее существование никто и не отрицает. Но по дефолту все приложение собирать в натив в .NET вроде не делают

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

CIL код компилируется при первой необходимости, потом нативный код кешируется, но никогда не перекомпилуется в рантайме. Хотя Рихтер пишет, что гипотетически CLR этому можно научить и может быть когда-нибудь научат.

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

А если всего лишь парочка прогонов, о не интерпретируется?

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