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类型中。显式类型转换会导致另一个错误。在这种情况下我该怎么做?谢谢。
答案 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喜欢保留自己的结尾。