簡體   English   中英

不允許使用 va_list 變量的地址? 錯誤:從不兼容的指針類型賦值?

[英]address of a va_list variable is not allowed? Error: assignment from incompatible pointer type?

在 Linux 上復制它的代碼如下:

GCC 4.8.5 20150623 (Red Hat 4.8.5-44) 不,我不能改變這個,它在 CentOS7 上,它需要留在那里)

#include <stdarg.h>

struct foo {
  va_list *pAP;
  const char *fmt;
};

void format_output( struct foo *pFoo );

void my_vprintf( const char *fmt, va_list ap )
{
  struct foo x;

  x.fmt = fmt;
  // why is this not allowed?
  x.pAP = &ap; // <- ERROR/WARNING: assignment from incompatible pointer type

  format_output( &x );
}

void my_printf( const char *fmt, ... )
{
  va_list ap;

  va_start( ap, fmt );
  my_vprintf( fmt, ap );
}

這是不允許的,因為在您的實現中, va_list恰好是數組類型。 這是標准允許的,但不是必需的。 (這有點煩人。)

當您將數組類型用作 function 參數時,它“衰減”為指針類型(指向數組中第一個元素的指針),這與指向數組類型的指針(這是pAP成員struct foo是)。

一個簡單的解決方法是在my_printf中創建struct foo而不是在my_vprintf中創建它。 另一種可能性是使struct foo成員成為va_list而不是指向va_list的指針,並使用va_copy而不是賦值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM