2012-04-10 3 views
2

두 가지 다른 것들의 체크섬을 취하는 함수를 작성하고 있습니다 : 하나, 파일; 두 개는 아카이브 항목 la BSD libarchive 라이브러리입니다. GNU의 coreutils에서 체크섬 코드를 빌 렸습니다.C : 코드 중복 예제

는 파일에 체크섬을 수행하는 내 코드는 다음과 같은 소스에서 읽어

을 : 아카이브 항목에서 읽어 내 코드에서

unsigned char buf[BUFLEN]; 
size_t bytes_read; 
FILE *fp; 
... 
while ((bytes_read = fread (buf, 1, BUFLEN, fp)) > 0) { ... } 

는, 해당 코드는

struct archive *ar; 
unsigned char buf[BUFLEN]; 
ssize_t bytes_read; 
... 
while ((bytes_read = archive_read_data(ar, buf, sizeof(buf))) > 0) { ... } 

으로 보이는 대부분의 코드가 같더라도 두 가지 다른 기능을 사용해야합니다. fread와 archive_read_data는 같은 수의 인수조차 갖고 있지 않기 때문에 함수 포인터를 전달하는 방법을 잘 모르겠습니다. (나는 fread (3) 대신에 read (2)를 사용하는 것으로 시작할 수 있다고 생각합니다. 그러나 그 방법은 진행하기위한 생산적인 방법이라고는 확신하지 못합니다.) 여기에 코드 중복을 피할 수있는 좋은 방법이 있습니까? 함수 포인터를 사용하여 작업하는 것 외에도 동일한 코드 조각을 별도의 파일에 넣은 다음 #including을 입력하여 수행 할 수 있지만보기에는 좋지 않습니다.

이 특정 예에서 함수에 대한 코드는 그렇게 길지 않으므로 코드를 복제하면 큰 문제가되지 않습니다. 우아한 솔루션이 있는지 궁금합니다.

답변

2

프로토 타입이 동일한 fread()archive_read_data()에 대한 래퍼 함수를 ​​직접 만들 수 있습니다. 이러한 각 래퍼에는 하나의 코드 행만 포함되어 기본 read() 함수를 호출하고 필요에 따라 매개 변수를 다시 정렬합니다.

그런 다음 함수 포인터를 사용하여 두 래퍼를 컨텍스트에 따라 구별합니다.

  • 는 데이터 버퍼에 대한 포인터
  • 바이트 수 당신은 래퍼를 작성할 수
  • 을 읽을 수있는 데이터 소스에

    • 포인터 :

    0

    두 함수는 정말 불과 3 개 인수가 필요합니다 함수가 fread 인 경우 archive_read_data (또는 그 반대)과 동일한 서명을 제공합니다.

    ssize_t my_fread(FILE *fp, char *buf, int len) { 
        return fread(buf, 1, len, fp); 
    } 
    
    1

    체크섬을 분석하는 코드가 동일한 경우 함수로 만들 수 있습니다. 즉 중괄호 안에있는 부분입니다. 내 의견으로는, 그들이 동일한 기능을 부르는 경우에 2 개의 분리되는 반복이있는 것은 그렇게 나쁘지 않다. 그들은 얇은 포장지로 간주 될 수 있습니다.