指向联合功能的指针

时间:2018-03-23 22:38:47

标签: c visual-studio

Visual Studio在此代码中给出了错误

typedef union
{
  double value;
  double (*UnFunc)(double);
  double (*BiFunc)(double, double);
  double (*VarAssi)(vars_t *, elem_t, elem_t, error_t *);
  void (*FuncAssi)(custom_funcs_t *, elem_t, expr_t, error_t *);
  char delimiter;
} body_t;

typedef struct
{
  const char *name;
  int priority;
  body_t body;
} elem_info_t;

static const elem_info_t s_STD_UN_FUNC[] = {
  {"sqrt",   2, sqrt},
  {"sin",    2, sin},
  {"cos",    2, cos},
  {"tg",     2, tan},

VS说(强调功能分配)

  

错误C2440:'初始化':无法转换为' double(__ cdecl   *)(双)'到'加倍'

但所有类型的指针都已存在于union类型中。显式类型转换会导致另一个错误。在这种情况下我该怎么做?谢谢。

2 个答案:

答案 0 :(得分:3)

初始化联合时,如果您没有指定哪一个,则默认情况下会初始化第一个成员。那是错误的来源。

您需要使用指定的初始值设定项来指定要设置的成员:

static const elem_info_t s_STD_UN_FUNC[] = {
  {"sqrt",   2, { .UnFunc = sqrt}},
  {"sin",    2, { .UnFunc = sin}},
  {"cos",    2, { .UnFunc = cos}},
  {"tg",     2, { .UnFunc = tan}},
  ...

答案 1 :(得分:0)

发布的代码包含几个关键缺失元素。

以下显示了编写代码的可接受方式

#include <math.h>

// set these following 5 typedefs to your actual types
typedef int error_t;
typedef int vars_t;
typedef int elem_t;
typedef int expr_t;
typedef int custom_funcs_t;

typedef union uFuncTypes
{
    double value;
    double (*UnFunc)(double);
    double (*BiFunc)(double, double);
    double (*VarAssi)(vars_t *, elem_t, elem_t, error_t *);
    void   (*FuncAssi)(custom_funcs_t *, elem_t, expr_t, error_t *);
    char   delimiter;
} body_t;

typedef struct funcStruct
{
  const char *name;
  int priority;
  body_t body;
} elem_info_t;

static const elem_info_t s_STD_UN_FUNC[] = {
  { "sqrt",   2, .body.UnFunc = sqrt },
  { "sin",    2, .body.UnFunc = sin  },
  { "cos",    2, .body.UnFunc = cos  },
  { "tg",     2, .body.UnFunc = tan  }
};

注意:对于大多数调试器,为了正确显示结构中的字段以及联合内部,需要在定义中包含适当的标记名称

最新的C标准强烈建议不要在类型名称的末尾使用_t,因为C喜欢保留自己的结尾。