링크 로 if 구문 이 너무 많은 문 제 를 해결 합 니 다(C/C+구현)

17915 단어 c/c++
원인
http://www.cnblogs.com/code-style/p/3499408.html
디자인 모드 솔 루 션(python 언어 기반)
http://www.cnblogs.com/code-style/p/3501713.html
http://www.cnblogs.com/code-style/p/3502105.html
디자인 모델 로 이 루어 진 후에 나 는 이른바 디자인 모델 이 사실은 C 언어 에서 링크 가 아니 냐 는 것 을 알 게 되 었 다.현재 노드 를 처리 할 수 있 으 면 처리 할 수 없고 다음 노드 를 처리 할 수 없습니다.
메시지 디자인
 message.h
#ifndef MESSAGE_H

#define MESSAGE_H



#define TRUE 1

#define FALSE 0



typedef struct {

    int sender;

    int isSend;

    int isCharge;

    char date[8];

}Message;



Message * makeMessage(const int sender, const char *date);

void setSendFlag(Message * const message);

void setChargeFlag(Message * const message);

int isSameDate(const Message * const message, const char * const date);

char * format(const Message * const message);

const char * boolStr(const int value);



#endif

message.c
#include <assert.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include "message.h"



Message * makeMessage(const int sender, const char *date)

{

    Message *message = (Message*)malloc(sizeof(Message));

    assert(message != NULL);

    message->sender   = sender;

    message->isSend   = FALSE;

    message->isCharge = FALSE;

    strncpy(message->date, date, 8);

    return message;

}



const char * boolStr(const int value)

{

    return value == TRUE ? "TRUE" : "FALSE";

}



char * format(const Message * const message)

{

    #define BUF_SIZE 1024

    static char buffer[BUF_SIZE];

    memset(&buffer, 0, BUF_SIZE);

    snprintf((char*)&buffer, BUF_SIZE, "Message <%d isSend:%s isCharge:%s>
", \ message->sender, boolStr(message->isSend), boolStr(message->isCharge)); return (char*)buffer; } void setSendFlag(Message * const message) { message->isSend = TRUE; } void setChargeFlag(Message * const message) { message->isCharge = TRUE; } int isSameDate(const Message * const message, const char * const date) { if (strncmp(message->date, date, 8) == 0) { return TRUE; } else { return FALSE; } }

testMessage.c
#include <stdio.h>

#include "message.h"

#include "gtest/gtest.h"



TEST(MESSAGE,makeMessage){

    Message *message = makeMessage(1,"20131212");

    EXPECT_EQ(1, message->sender);

    EXPECT_STREQ("Message <1 isSend:FALSE isCharge:FALSE>
", format(message)); }

 
링크 클래스 의 실현
 node.h
#ifndef NOTE_H

#define NOTE_H



typedef struct Node{

    void *ptr;

    struct Node *next;

}Node;



Node *makeListWithArray(void *array[], int length);

void foreach(Node *list, void (*process) (Node *));

#endif

node.c
#include <stdlib.h>

#include <assert.h>

#include "node.h"



Node *makeListWithArray(void *array[], int length)

{

    int i;

    Node *last = NULL;



    assert(array != NULL && length > 0);

    for(i = length - 1; i >= 0; i--)

    {

        Node *node = (Node*)malloc(sizeof(Node));

        node->ptr  = array[i];

        node->next = last;

        last = node;

    }



    return last;

}



void foreach(Node *list, void (*process) (Node *))

{

    Node *current = NULL;



    assert(list != NULL && process != NULL);

    for(current = list; current != NULL; current = current->next)

    {

        process(current);

    }

}

testNode.c
#include <stdio.h>

#include "node.h"

#include "gtest/gtest.h"



void printNode(Node *node)

{

    static int i = 0;

    int data[] = {1,2,3};

    EXPECT_EQ(data[i], *(int*)node->ptr);

    i++;

}



TEST(NODE,makeListWithArray){

    int i;

    int data[] = {1,2,3};

    void *aSet[] = {&data[0], &data[1], &data[2]};

    Node *list = makeListWithArray(aSet, 3);

    foreach(list, printNode);

}

 
프로그램 입구 구현(main.c)
#include <stdio.h>

#include <string.h>

#include "message.h"

#include "node.h"



# define FALSE 0

# define TRUE  1



typedef int BOOL;

typedef BOOL (*FuncIsAllowSend)(Message *, Node*);





BOOL isAllowSendCheckDate(Message *message, Node *node)

{

    FuncIsAllowSend isAllowSend = NULL;



    if(strcmp(message->date, "20130101") == 0)

    {

        return FALSE;

    }

    

    isAllowSend = (FuncIsAllowSend) node->next->ptr;

    return isAllowSend(message, node->next);

}





BOOL isAllowSendCheckWhiteList(Message *message, Node *node)

{

    FuncIsAllowSend isAllowSend = NULL;



    if(message->sender == 10)

    {

        return TRUE;

    }



    isAllowSend = (FuncIsAllowSend) node->next->ptr;

    return isAllowSend(message, node->next);

}



BOOL isAllowSendWithDefault(Message *message, Node *node)

{

    setChargeFlag(message);

    return TRUE;

}



int main()

{

    Message *message = makeMessage(1,"20131212");

    void *actionList[] = {(void*)&isAllowSendCheckDate, 

                        (void*)&isAllowSendCheckWhiteList, 

                        (void*)&isAllowSendWithDefault};

    Node *theList = makeListWithArray(actionList, sizeof(actionList)/4);

    FuncIsAllowSend isAllowSend = (FuncIsAllowSend)theList->ptr;

    if(isAllowSend(message, theList) == TRUE)

    {

        setSendFlag(message);

    }

    printf("%s
",format(message)); }

 
코드 스타일 은 사실 C 스타일 이지 만 gtest 를 사용 하려 면 g++를 사용 하여 프로그램 을 컴 파일 디 버 깅 해 야 합 니 다.명령 은 다음 과 같 습 니 다.
#   :    gtest            



g++ -c message.c

g++ -c testMessage.c

g++ message.o testMessage.o -lgtest -lpthread

./a.out



g++ -c node.c

g++ -c testNode.c

g++ node.o testNode.o -lgtest -lpthread

./a.out 



g++ -c main.c

g++ message.o node.o main.o

./a.out

 

좋은 웹페이지 즐겨찾기