函数式宏定义

函数式宏定义

问题描述:

问题是,我不太明白以下定义的作用。有人可以向我解释吗?函数式宏定义

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

你的宏几乎没有任何东西。它将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

但是还有一件事。这是整个的#define序列:

#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 */ 

所以四大功能有两个定义取决于你是否在串行或并行模式。然而,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()。