abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 14:11 | Zajímavý článek

Jiří Eischmann na MojeFedora.cz řeší, jak zlepšit konzistenci mezi GTK 4 a GTK 3. Pokud už používáte Fedora 36 Workstation, asi jste si všimli, že vzhled aplikací není tak konzistentní jako dřív. Aplikace, které jsou už portované na GTK 4 mají "ploché" téma vzhledu definované knihovnou libadwaita. Aplikace používající GTK 3 zůstávají u původního tématu Adwaita.

Ladislav Hagara | Komentářů: 5
dnes 12:33 | Pozvánky

Byl zveřejněn program konference InstallFest 2022. Konference proběhne o víkendu 11. a 12. června v Praze na Karlově náměstí 13.

Ladislav Hagara | Komentářů: 1
dnes 09:44 | Nová verze

Rocky Linux 8.6, klon Red Hat Enterprise Linuxu (RHEL) 8.6, byl vydán. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
dnes 01:11 | Nová verze

Byla vydána nová verze 13.1 svobodného unixového operačního systému FreeBSD. Podrobný přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
dnes 00:11 | Nová verze

Byla vydána nová verze 1.2 svobodného multiplatformního vektorového grafického editoru Inkscape. Podrobný přehled novinek i s náhledy a animovanými gify v poznámkách k vydání a ve videu na YouTube.

Ladislav Hagara | Komentářů: 0
včera 23:33 | Nová verze

Multiplatformní audio přehrávač DeaDBeeF (Wikipedie) byl vydán v nové verzi 1.9.0 a krátce na to v opravné verzi 1.9.1. Odstraněna byla ruská lokalizace.

Ladislav Hagara | Komentářů: 19
včera 18:22 | Nová verze

Byla vydána nová verze 2022.2 průběžně aktualizované linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek i s náhledy a seznamem nových nástrojů v oficiálním oznámení.

Ladislav Hagara | Komentářů: 0
včera 09:00 | Pozvánky

Letošní konference OpenAlt proběhne již o víkendu 17. a 18. září. Organizátoři hledají přednášející.

Ladislav Hagara | Komentářů: 1
15.5. 16:11 | Zajímavý článek

Alyssa Rosenzweig informuje o aktuálním stavu open source ovladače pro Apple M1 GPU. Po trojúhelníku a točící se kostce lze již zobrazit i točícího se králíčka z glmark2.

Ladislav Hagara | Komentářů: 9
15.5. 15:22 | Nová verze

Nadace The Document Foundation oznámila vydání sedmého opravného balíku LibreOffice 7.2 Community, posledního z řady LibreOffice 7.2. Opravuje téměř 50 chyb.

Petr Valach | Komentářů: 6
Na sociálních sítích nebo jiných webových diskuzích vystupuji pod
 (61%)
 (17%)
 (22%)
Celkem 265 hlasů
 Komentářů: 19, poslední dnes 17:03
Rozcestník


Dotaz: Chycení výjimky v C

29.12.2015 20:41 Jardík
Chycení výjimky v C
Přečteno: 616×
Zahrávám si s myšlenkou chytit např. C++ výjimku v C kódu. Chápu, že to nebude přenositelné. Četl jsem nějakou dokumentaci k libunwind a našel způsob, jak z C vyhodím výjimku (musím linkovat k libgcc nebo k libunwind). Taky má GCC attribut cleanup, který mi zavolá funkci, když nějaká C++ funkce (callback) vyhodí výjimku, taže bych uměl i uklidit. Mou z C vyhozenou výjimku (pomocí _Unwind_RaiseException) dokáže chytit C++ catch(...) blok. Zajímalo by mě ale, jestli jde nějak kompilátoru (GCC) říct, aby zavolal nějakou funkci či skočil na návěští, když callback vyhodí výjimku. Prostě jen tak ze zvědavosti. Zahrávám si s myšlenkou v blízké budoucnosti vytvořit překladač nespecifikovaného jazyka do C a chtěl bych tam mít i výjimky, aniž bych použil C++, ale chtěl bych, aby to volalo i C++ destruktory a dalo se to chytit v catch(...) bloku, zavolá-li mou funkci někdo z C++.
// throwing_code.c

#include <stdint.h>
#include <stdio.h>

typedef enum {
	_URC_NO_REASON = 0,
	_URC_FOREIGN_EXCEPTION_CAUGHT = 1,
	_URC_FATAL_PHASE2_ERROR = 2,
	_URC_FATAL_PHASE1_ERROR = 3,
	_URC_NORMAL_STOP = 4,
	_URC_END_OF_STACK = 5,
	_URC_HANDLER_FOUND = 6,
	_URC_INSTALL_CONTEXT = 7,
	_URC_CONTINUE_UNWIND = 8
    } _Unwind_Reason_Code;
    
typedef struct _Unwind_Exception _Unwind_Exception;

typedef void (*_Unwind_Exception_Cleanup_Fn)
		(_Unwind_Reason_Code reason, _Unwind_Exception *exc);

struct _Unwind_Exception {
	    uint64_t			 exception_class;
	    _Unwind_Exception_Cleanup_Fn exception_cleanup;
	    uint64_t			 private_1;
	    uint64_t			 private_2;
    };


extern _Unwind_Reason_Code
_Unwind_RaiseException(_Unwind_Exception *e);


void exception_cleanup(_Unwind_Reason_Code reason, _Unwind_Exception *e)
{
	printf("Exception cleanup, reason = %i, e = %p\n", (int)reason, (void*)e);
}


_Unwind_Exception e = {
	((uint64_t)('J') << 56) | ((uint64_t)('A') << 48) | ((uint64_t)('R') << 40) |
	((uint64_t)('D') << 32) | ((uint64_t)('I') << 24) | ((uint64_t)('K') << 16) |
	((uint64_t)('\0') << 8) | ((uint64_t)('\0') << 0),
	exception_cleanup,
	0,
	0
};

void throwing_code_throw()
{
	_Unwind_RaiseException(&e);
}
// catching_code.cpp

#include <cstdio>

extern "C" void throwing_code_throw();

int main(int argc, char **argv)
{
	try {
		throwing_code_throw();
		printf("after exception\n");
	}
	catch (...) {
		printf("caught exception\n");
	}
	return 0;
}

Odpovědi

kozzi avatar 30.12.2015 17:53 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Chycení výjimky v C

Zrovna na toto tema se nedavno vedla diskuze u jazyka D. A pokud vim tak se uz i nekam pokrocilo a v blizko dobe bude mozne v D chytat vyjimky z C++. Takze mozna se poptat nekoho z fora D.

nejaka prace uz je i zaclenena ale nevim zda ti to bude uzitecne

https://github.com/D-Programming-Language/dmd/pulls?utf8=✓&q=is%3Apr+author%3AWalterBright+

Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
31.12.2015 02:18 Jardík
Rozbalit Rozbalit vše Re: Chycení výjimky v C
Kouknu na to, díky.
DaBler avatar 31.12.2015 09:26 DaBler | skóre: 17 | blog: dabler | Brno
Rozbalit Rozbalit vše Re: Chycení výjimky v C

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.