![](/img/trans.png)
[英]Writing a function using a macro with variable number of arguments
[英]Macro using variable arguments
請讓我知道是否有辦法在宏函數中使用變量參數並使下面的宏代碼工作。
換句話說,有什么方法可以在 va_start 中使用局部變量。
typedef struct
{
char *p1;
char *p2;
char *p3;
}Pointers;
#define NULLCHECK_VR(num, ...) \
{ \
va_list valist; \
int v_index; \
\
va_start(valist, num); \
\
for( v_index=0; v_index < num; v_index++) \
{ \
if( NULL == va_arg(valist, void *)) \
{ \
printf("NULL \n"); \
} \
else \
{ \
printf("NOT NULL \n"); \
} \
} \
\
va_end(valist); \
}
int main(void)
{
Pointers ptr;
memset(&ptr, 0, sizeof(Pointers));
NULLCHECK_VR(3, ptr.p1, ptr.p2, ptr.p3)
return (0);
}
您可能會使用常規功能:
void NULLCHECK_VR(int num, ...)
{
va_list valist;
int v_index;
va_start(valist, num);
for( v_index=0; v_index < num; v_index++)
{
if( NULL == va_arg(valist, void *))
{
printf("NULL\n");
}
else
{
printf("NOT NULL\n");
}
}
va_end(valist);
}
或在 C++ (17)
template <typename Ts>
void NULLCHECK_VR(const Ts*... ptrs)
{
((std::cout << (ptrs == nullptr ? "NULL\n" : "NOT NULL\n")), ...);
}
您不能使用va_list
訪問局部變量。 va_start
、 va_copy
和va_end
宏僅用於處理可變參數函數參數。 宏不是函數。
對於 C 可變參數宏,宏替換文本中的__VA_ARGS__
標識符將擴展為可變參數,因此NULLCHECK_VR
宏的可能實現如下:
#define NULLCHECK_VR(num, ...) \
do { \
void *_ptrs[] = { __VA_ARGS__ }; \
int _num = (num); \
int v_index; \
\
for (v_index = 0; v_index < _num; v_index++) \
{ \
if (NULL == _ptrs[v_index]) \
{ \
printf("NULL \n"); \
} \
else \
{ \
printf("NOT NULL \n"); \
} \
} \
} while (0)
此處, __VA_ARGS__
已用於初始化本地_ptrs
數組。
(我添加了局部變量_num
以避免多次擴展num
參數,並且我使用了do
while (0)
成語將塊變成了語句。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.