최근에 나는 오히려 유용하다고 gcc의 확장을 가로 질러왔다 . 예를 들어, 다음 코드 섹션이 주어지면 foo
호출 내 모든 경우에 모든 메모리가 명시 적으로 유지 관리되고 처리되어야합니다. 그러나휴대용 상당
void foo() {
char * buff = ...; /* some memory allocation */
char * buff2 = 0, * buff3 = 0;
if (! buff) {
return;
} else {
buff2 = ...; /* memory allocation */
if (! buff2) {
goto clean_exit;
} else {
/* ... and so on ... */
}
}
clean_exit:
free (buff);
free (buff2);
free (buff3);
}
확장 프로그램을 사용하여 그 이제 모든 메모리/다른 또는 고토 구성체가 통합 메모리와 결합하는 경우 중첩을 사용하지 않고 범위에 기초하여 회수
#define clean_pchar_scope __attribute__((cleanup(pchar_free)))
void pchar_free (char ** c) { free (*c); }
void foo() {
char * buff clean_pchar_scope = ...; /* some memory allocation */
char * buff2 clean_pchar_scope = 0, * buff3 clean_pchar_scope = 0;
if (! buff)
return;
buff2 = ...; /* memory allocation */
if (! buff2)
return;
/* and so on */
}
을 줄일 수 함수의 릴리스 섹션. 나는 goto의 사용이 if/else 구조가 더 중첩되어 있기 때문에 피할 수 있다는 것을 알고 있습니다. (예, goto에 거룩한 전쟁은 없습니다 ...) 예가 고안되었지만 이것이 사실 일 수 있습니다. 매우 유용한 기능.
불행히도, 아는 한, 이것은 gcc에만 해당됩니다. 나는 같은 일을하는 어떤 포터블 방식에도 관심이있다 (존재한다면). 누구도 gcc 이외의 다른 작업을 해본 경험이 있습니까?
편집 : 이식성이 작동하지 않는 것으로 보입니다. 그것을 고려하여, 이것을 할 방법이 있습니까 gcc 공간 밖에 있습니까? 다행히이 소멸자와 C의 표준 기능 ++의
다소 관련 : http://stackoverflow.com/questions/1602398/linux-dlopen-can-a-library-be-notified-when-it-is-loaded – jldupont
다소 거친 것입니다. 내가 찾고 있어요. 두 경우 모두 그 해결책은 여전히 gcc 특정 (수용된 대답의 경우)이거나 C++가 클래스 기반 응답과 관련이있는 것처럼 보입니다. – ezpz