LINUX.ORG.RU

На чем написан rxvt-unicode?

 , , ,


1

3

Мне казалось, что на C, я полез в исходники, а там


#include "../config.h"
#include "rxvt.h"

#include <stdlib.h>
#include <string.h>

int
main (int argc, char *argv[])
try
  {
    ptytty::init ();
    rxvt_init ();

    rxvt_term *t = new rxvt_term;
    t->init (argc, argv, environ);
    ev_run ();

    return EXIT_SUCCESS;
  }
catch (const class rxvt_failure_exception &e)
  {
    return EXIT_FAILURE;
  }

Вроде и C (#include <stdlib.h>), но что там делают new, class и прочие? Ни разу такого не видел (впрочем, опыта как такового у меня пока нет).


написано на CC++ либо на С++С

выбирай какой диалект ближе.

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

Хм, похоже, что да, в Makefile.in:
COMPILE = $(CXX) -I.. -I$(srcdir) -I. -I$(srcdir)/../libev -I$(srcdir)/../libptytty/src $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(XINC)

Значит сишные заголовочные файлы это C legacy от оригинальной версии, наверное.

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

Значит сишные заголовочные файлы это C legacy от оригинальной версии, наверное.

не обязательно

Harald ★★★★★ ()

Использование заголовков от libc не подразумевает использование C... Они вполне себе работают в C++, это даже не legacy и не deprecated.

intelfx ★★★★★ ()

Оригинальный rxvt написан на С, а вот rxvt-unicode частично перепилен на С++. По крайней мере весь код завернут в классы. Обычно это называется «Си с классами».

#include <stdlib.h> - это необязательно признак pure C кода. В крестах тоже так пишут, хотя кошернее использовать #include <cstdlib>.

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

Это понятно, просто обычно их оформляют в extern "C" {} или пишут вместо #include <stdlib.h> #include <cstdlib>. Хоть C++ и совместим с C и это одна из важнейших фич языка, все же они различаются и для избежания конфликтов, проблем, сишные заголовочные файлы оформляются так, как я написал выше.
Впрочем, я думаю, что ты и так это знаешь.

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

Они вполне себе работают в C++, это даже не legacy и не deprecated.

Это всё таки легаси и deprecated, в плюсовом коде нужно использовать cstdlib.

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

C++ не совместим с Си, и если ты посмотришь в тот же stdlib.h, ты уже найдёшь там этот самый extern "C", обрамлённый #ifdef __cplusplus. Это всё уже предусмотрено.

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

С++ не совместим с Си

Еще как совместим, вообще-то. В тот же C++ 11 вносили изменения чтобы C++ был совместим с С99 (пруф). Сам Страуструп называет C++ «better C».

ты уже найдешь там этот самый extern "C"

http://pastebin.com/e8VMteRa — можешь поискать, если хочешь, но там его нет.

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

Еще как совместим, вообще-то.

«To preserve a high degree of compatibility» не означает «совместим».

Очевидный пример: C умеет designated initializers (struct foo f = { .bar = 1, .quux = 2 };), а плюсы — не умеют и не будут.

можешь поискать, если хочешь, но там его нет.

А я нашёл. __BEGIN_DECLS называется. Из features.h включается sys/cdefs.h, а там этот макрос дефайнится в extern "C" {, если обнаружено, что исходник собирается плюсовым компилятором.

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

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf

§ D.5, страница 1242. Все, что перечислено в приложении D - deprecated.

Тем не менее, стандарт явно оговаривает, что хидеры вида <name.h> из стандартной С библиотеки должны нормально работать для обратной совместимости.

archie ()

Вот так вот. Библиотка С++ дублирует функциональность библиотеки C

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

По крайней мере весь код завернут в классы. Обычно это называется «Си с классами».

«Си с классами» обычно называется язык программирования, который был предшественником С++.

asaw ★★★★★ ()

неужто зарефакторили, раньше вроде на чистом С был

anonymous ()

(#include <stdlib.h>) вообще не показатель

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

«Си с классами» обычно называется язык программирования, который был предшественником С++.

Это Страус так его называл. А сейчас под «Си с классами» (в противовес полноценному С++) обычно понимается код, который заимствует различный синтаксический сахарок из С++, но не использует никаких базовых идиом и паттернов С++, которые собственно и делают С++ тем, чем он есть.

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

Не слышал, обычно такое называют просто «говнокод».

asaw ★★★★★ ()

Это сильно-урезанный C++, автор много пишет именно в таком стиле: http://software.schmorp.de/ (см. libev). Иными словами, это С++ c сильным уклоном в C (сделано ради читабельности и оптимизаций, которые известны только автору :)

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

C умеет designated initializers (struct foo f = { .bar = 1, .quux = 2 };), а плюсы — не умеют и не будут.

Какой rationale у этого решения? Писать конструкторы, даже для структур? Честно говоря, я бы лучше добавил именованные параметры, как в питонах всяких, типа:

#include <string>

std:string str(s = "Foo bar baz", count = 100500 /* preserve some space for future */);

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

Этот диалект называется «C с классами», и за его использование надо кастрировать и отправлять на урановые рудники.

anonymous ()

Ну это такой C++. Один из вариантов.

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