2017-11-11 9 views
1

문제는 다음 정의가하는 일을 이해하지 못한다는 것입니다. 누군가 나에게 설명해 줄 수 있니?함수와 같은 매크로 정의

#define Vpc3MemSet_(_pToVpc3Memory, _bValue, _wLength)\ 
      Vpc3MemSet(_pToVpc3Memory, _bValue, _wLength) 

답변

1

매크로는 거의 아무것도 수행하지 않습니다. Vpc3MemSet_ (밑줄)은 Vpc3MemSet (밑줄 없음)으로 바뀝니다. 이러한 매크로는 대개 플랫폼에 종속적 인 다양한 변형이있는 경우에 적합합니다 (Linux, macOS 및 Windows의 경우). (가상의) 예를 들면 : 당신은 같은 매크로 호출로 플랫폼에 의존하는 함수를 호출 할 수 있습니다

#ifdef __WINDOWS__ 
    #define Vpc3MemSet_(_pToVpc3Memory, _bValue, _wLength)\ 
     Vpc3MemSet(_pToVpc3Memory, _bValue, _wLength) 
#else 
    #define Vpc3MemSet_(_pToVpc3Memory, _bValue, _wLength)\ 
     memset(_pToVpc3Memory, _bValue, _wLength * sizeof(Vpc3)) 
#endif 

는 :

Vpc3MemSet_(memory, value, length); 

이 다른 기능은 Windows 및 Linux에서 호출에 확장됩니다.

+0

환상적입니다. 감사합니다. – Tage

0

그러나 한 가지 더.

#if VPC3_SERIAL_MODE 


#define CopyToVpc3_(_pToVpc3Memory, _pLocalMemory, _wLength)\ 
      CopyToVpc3(_pToVpc3Memory, _pLocalMemory, _wLength) 

#define CopyFromVpc3_(_pLocalMemory, _pToVpc3Memory, _wLength)\ 
      CopyFromVpc3(_pLocalMemory, _pToVpc3Memory, _wLength) 

#define Vpc3MemSet_(_pToVpc3Memory, _bValue, _wLength)\ 
      Vpc3MemSet(_pToVpc3Memory, _bValue, _wLength) 

#define Vpc3MemCmp_(_pToVpc3Memory1, _pToVpc3Memory2, _wLength)\ 
      Vpc3MemCmp(_pToVpc3Memory1, _pToVpc3Memory2, _wLength) 

#else 

#define CopyToVpc3_(_pToVpc3Memory, _pLocalMemory, _wLength)\ 
      memcpy(_pToVpc3Memory, _pLocalMemory, _wLength) 

#define CopyFromVpc3_(_pLocalMemory, _pToVpc3Memory, _wLength)\ 
      memcpy(_pLocalMemory, _pToVpc3Memory, _wLength) 

#define Vpc3MemSet_(_pToVpc3Memory, _bValue, _wLength)\ 
      memset(_pToVpc3Memory, _bValue, _wLength) 

#define Vpc3MemCmp_(_pToVpc3Memory1, _pToVpc3Memory2, _wLength)\ 
      memcmp(_pToVpc3Memory1, _pToVpc3Memory2, _wLength) 

#endif /* #if VPC3_SERIAL_MODE */ 

그래서 네 개의 함수를 사용하면 직렬 또는 병렬 모드에 있는지 여부에 따라 두 가지 정의가이 전체 #DEFINE 순서입니다. 아직 memset 함수() 함수는 다음과 같이, 응용 프로그램 소스 파일에서 호출됩니다

/*-----------------------------------------------------------------------*/ 
/* init application data             */ 
/*-----------------------------------------------------------------------*/ 
    memset(&sDpAppl, 0, sizeof(sDpAppl)); 

/*-----------------------------------------------------------------------*/ 
/* initialize VPC3              */ 
/*-----------------------------------------------------------------------*/ 
#if VPC3_SERIAL_MODE 
    Vpc3AsicAddress = (VPC3_ADR)VPC3_ASIC_ADDRESS; 
    pVpc3 = &sVpc3OnlyForInit; 
    pDpSystem = &sDpSystemChannel1; 

    memset(pVpc3, 0, sizeof(VPC3_STRUC)); 
#else 
    pVpc3Channel1 = (VPC3_STRUC_PTR)VPC3_ASIC_ADDRESS; 
    Vpc3AsicAddress = (VPC3_ADR)VPC3_ASIC_ADDRESS; 
    pVpc3 = pVpc3Channel1; 
    pDpSystem = &sDpSystemChannel1; 
#endif//#if VPC3_SERIAL_MODE 

이 다른 기능 것처럼. 또는, 나는 아직도 무엇인가 놓치고 있냐? :/ 그건 그렇고, 나는 직렬 모드이고 CopyToVpc3(), CopyFromVpc3(), Vpc3MemSet(), Vpc3MemCmp()를 이미 정의했다.