2017-01-10 14 views
0

현재 두 개의 다른 기능 사이에 캡슐화되어야하는 다양한 기능이있는 C 프로젝트를 작업 중입니다. 도식적으로, 그것은 다음과 같습니다C11 전 처리기를 사용하여 캡슐화 기능

int func1(int arg) { 
    prepare(); 
    doStuff(); 
    undo(); 
    return stuff; 
} 
char func2(int arg1, char* arg2) { 
    prepare(); 
    doOtherStuff(); 
    undo(); 
    return results; 
} 

I했습니다 들었다 전처리 그래서 그 전에 어떤 처리기 미신적 점보를 사용하여 실제 함수 본문 후 prepare()undo() 기능을 삽입 할 수 있으며, 매우 강력? 전처리기를 피할 수 없다면 전처리기를 사용하지 말 것을 강력히 권유합니다.하지만 가능한지 궁금합니다.

건배. 이

답변

1

당신은 갈이 좋은 생각인지 여부

typedef void stuff_t (void*); 

void execute (stuff_t* stuff, void* result) 
{ 
    prepare(); 
    stuff(result); 
    undo(); 
} 

int func1(int arg) { 
    int result; 
    execute(do_stuff, &result); 
    return result; 
} 

char func2(int arg1, char* arg2) { 
    char result; 
    execute(doOtherStuff, &result); 
    return result; 
} 

:

#define MY_MACRO(doStuff) \ 
{       \ 
    prepare();   \ 
    doStuff    \ 
    undo();    \ 
} 
+0

나는이 답변을 읽는 즉시 삭제할 것입니다. 왜냐하면 읽는 것이 좋다고 생각하지 않기 때문입니다. –

+0

감사합니다. 나는 그 때 포스트를 전부 제거 할 것이다. – Freeman

+0

그것이 효과가 있는지 확인 했습니까? 'doStuff' 인수는 당연히 함수 이름이 아니라 실행하고자하는 코드 조각입니다. –

1

그냥 기록을 위해, 다른 기능 포인터 템플릿 시스템의 형태를 설정하는 것입니다 코드가 실제로 수행해야하는 작업과 코드 재사용 가능성에 대한 요구 사항에 따라 다릅니다.

+0

누군가 내 의견을 무시하고 투표했습니다. 그걸 잘못 본거야? 감사. –

+0

@barakmanos "doStuff"가 무엇인지에 달려 있다고 생각합니다. 그것은 프로세서 전 토큰으로 평가할 수 있어야합니다. 그리고 아마도 누락 된 세미콜론? 'MY_MACRO (a = b);'는 컴파일되지 않지만'MY_MACRO (a = b;);'는 컴파일됩니다. – Lundin

+0

글쎄,'doStuff' 인자는 당신이 수행하기를 원하는 어떤 코드 일뿐입니다 (이것은 OP에 대한 주석에도 언급되어 있습니다). 예를 들어'a = b; c = d;'. 그래서 당신은 한 문장으로 제한되지 않습니다. 물론, 세미콜론을 추가 할 수도 있었지만, "코드의 모든 부분"은 분명히 "모든 ** 합법적 인 ** 코드"를 의미하기 때문에 여기에 요점을 놓치고 있다고 느꼈습니다. 그래서 이것이 왜 아래 표결에 좋은 이유가 될지 모르겠다. –