Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Creating and processing XML feels awkward in most programming languages. With Blasien, a tiny C++11 header library, XML in C++ feels easy and natural. As an extra the XML that is written is mostly validated at compile time.
> глобалки alt и src
Интересно, а можно ли как-то извернуться и вогнать туда произвольные атрибуты, используя наиболее короткую запись.
Приближения, которые приходят в голову:
1. Конструктор от строки: запись $("src")="...", $("alt")="...." - 5 лишних символов на параметр
2. Шаблонная использовать строки как отдельный параметр: "src", "...", "alt", "..." - 2 лишних символов на параметр + нельзя "="
3. Макрос, который делает # своим нечётным аргументам: запись src, "...", alt, "..." - нельзя "="
А всё нормально будет: у функции img ноль параметров, а все значения она берёт из глобальных переменных. Так что и такую возможность Борманд предусмотрел.
А как оно работает?
Оператор запятая возвращает правый аргумент. Оператор присваивания возвращает const char* (goatse). Но функция ничего не принимает!
в С, обявление `int f();` идентично `int f(...);`. функция `int f(void)` - не принимает аргументов, а без этого войда у функции нет ограничения на аргументы и их количество.
Давно-давно,когда мы все еще не родились, а у некоторых даже и папы с мамами еще не родились, в сях нельзя было указывать аргументы в декларейшене функции.
Всё было на совести программиста, компилятор ничего не проверял.
Просто писали foo() и всё.
Когда ввели возможность указывать аргументы, то ради обратной совместимости сделали так:
1) foo() -- НЕИЗВЕСТНО какое аргументы (комплиятор может не проверять)
2) foo(void) --аргов точно нет.
Мне кажется это написано в книжечке Кернигана и Ричи. Такая тонкая книжка по основам сей, достаточно годная.
А старый код ещё будет компилироваться как надо? Не напорется ли на какие-нибудь новые правила в другом месте (скажем, UB какое-нибудь), из-за чего его проще будет переписать, а такая совместимость - не более, чем троллинг?
Ты писал что раньше нельзя было указывать аргумент ты в декларейшине вункции. И я задался довольно helloworldным вопросом как передать в функцию 1 аргумент, а затем его прочитать. И не получил однозначного ответа.
не в курсе про фортран. в С это был дизайн десижн, потому что в те времена "визуальных текстовых редакторов" еще не было - как и не было нормальных дисплеев - и сырцы редактировались построчно. поэтому и каждый аргумент на своей строчке. не удивлюсь если у фортрана была та же мотивация.
меня уже даже не удивит если кто на темплейтах/операторах/этц интерпретатор перла напишет...
Смотрю на стандарт ++14 и жду не дождусь 2014 года... ОЧЁРТ
из всех извратных (полезных) извратов что видел, это наверное самый извратный.
http://www.boost.org/doc/libs/1_58_0/libs/spirit/doc/html/spirit/qi/tutorials/mini_xml___asts_.html
но идея сама по себе интересная - перегружеными операторами дерево синтакса строить.
А что, так можно было? О_о
Интересно, а можно ли как-то извернуться и вогнать туда произвольные атрибуты, используя наиболее короткую запись.
Приближения, которые приходят в голову:
1. Конструктор от строки: запись $("src")="...", $("alt")="...." - 5 лишних символов на параметр
2. Шаблонная использовать строки как отдельный параметр: "src", "...", "alt", "..." - 2 лишних символов на параметр + нельзя "="
3. Макрос, который делает # своим нечётным аргументам: запись src, "...", alt, "..." - нельзя "="
капитан в треде
perforce чтоль?
Оператор запятая возвращает правый аргумент. Оператор присваивания возвращает const char* (goatse). Но функция ничего не принимает!
Рассказать в деталях, как оно работает, или оставить в качестве домашнего задания?
Подсказка: при соглашении cdecl стек чистится вызывающим кодом.
теперь понятно
Всё было на совести программиста, компилятор ничего не проверял.
Просто писали foo() и всё.
Когда ввели возможность указывать аргументы, то ради обратной совместимости сделали так:
1) foo() -- НЕИЗВЕСТНО какое аргументы (комплиятор может не проверять)
2) foo(void) --аргов точно нет.
Мне кажется это написано в книжечке Кернигана и Ричи. Такая тонкая книжка по основам сей, достаточно годная.
собственно, ворнинги были еще в борланд си 1993го года:) (правда там был ключик "ANSI C" или "K&C", и вот в ANSI C были варнинги)
Ну вот вижалси до сих пор компилирует, но пишет ворнинги
https://msdn.microsoft.com/en-us/library/efx873ys.aspx
зы: может быть и напорица на что-то, я никогда не поддерживал код, написанный до 1989го года (или когда там вышли анси си)
Обладая этим знанием можно его получить.
Еще есть va_arg, но я не знаю будет-ли он тут работать.
Но Борманд не получал аргументов, он юзал глобальные переменные
Ты хочешь сделать функцию с переменным числом аргументов?
Ну так юзай va_arg, только делай это явно, и будет тебе щастье.
Си нужен чтобы переносить низкоуровневый шлак между платформами (особенно между процессорами), ну и писать на нём всё таки проще, чем на асме.
В дефинишене можно было указывать параметры, в декларейшене было не обязательно.
причем в дефинишене они писались немного не так.
Так что обращаться можно было очень просто. Просто комплятор не проверял что ты туда передаешь. Ты мог сказать kokoko("foo") и получить туда адрес
функция без аргументов это void img(void)
а раз не указано, то пофиг скока передавать
Чай не груви, не руби, и не котлин