【问题标题】:Struct function pointer error结构函数指针错误
【发布时间】:2017-03-16 12:48:29
【问题描述】:

在 struct my_struct 中,有一个名为 compute() 的函数指针。它是这样声明的:

struct my_struct
{
  double (*compute) (double input);
}

在一个单独的文件中,我初始化了该结构,以便我可以将该函数指向另一个。

static const struct my_struct data;
data.compute = ......

问题是,无论我将函数指针设置为什么,data.compute 都会出现以下错误:

error: expected '=', ',', ';', 'asm', or '__attribute__' before '.' token

我已经多次使用 '.' 来使用结构的数据成员。运算符,但我从未使用过函数指针。这里有什么不同的需要吗?

【问题讨论】:

  • 它应该在符号上工作,但由于您已将结构定义为const,因此您只能对其进行初始化,而不能在初始化后分配给它。但是,这与您遇到的错误不同。它的表现好像data 不是一个简单的词——好像它是宏扩展成奇怪的东西,或者类似的东西。结构类型在标头中声明,不是吗?在} 之后确实有一个分号,不是吗?
  • 是的,const 不是问题。我试过删除它,只是得到同样的错误。知道如何解决您所说的最后一部分吗?
  • 没有足够的代码——你没有提供一个 MCVE (minimal reproducible example)——我们没有代码可以编译并看到你看到的错误(或类似的东西)。我们需要您的标头和显示问题的最少代码集。您正在函数内编写data.compute = …,不是吗? (嗯:我怀疑不是 - 您必须使用初始化 … data = { … }; 或将赋值移动到函数中。)
  • 不,它不在函数中。您能否详细说明... data = { ... };?我不认识那个语法,第一个 ... 代表什么?
  • 全局变量是在任何函数之外定义的,并且没有关键字static。在定义全局变量之前可以有函数;您可以在它之前定义其他变量。您可以将全局变量定义为源文件中的最后一件事——但是您不能在同一个源文件中引用它,除非在您尝试引用它之前有一个extern 声明。在初始化器中提到它之前,必须告诉编译器 distance 是一个函数。无论如何,编译器必须知道函数。

标签: c pointers struct function-pointers


【解决方案1】:

它应该在符号上工作,但由于您已将结构定义为const,因此您只能初始化它而不能在初始化后分配给它。

但是,这与您遇到的错误不同。它的行为有点好像data 不是一个简单的词——好像它被宏扩展为奇怪的东西,或者类似的东西。结构类型在标头中声明,不是吗?而且它确实在 } 之后有一个分号,不是吗?

是的,const 不是问题所在。我试过删除它,只是得到同样的错误。知道如何解决您正在谈论的最后一部分吗?

一方面,没有足够的代码——您没有提供 MCVE (Minimal, Complete, and Verifiable Example)——我们没有可以编译并查看您看到的错误(或类似错误)的代码。我们需要您的标头和显示问题的最少代码集。

您在函数中编写data.compute = …,不是吗? (嗯:我怀疑不是 - 您必须使用初始化 … data = { … }; 或将赋值移动到函数中。)

不,它不在函数中。您能否详细说明… data = { … };?我不认识那种语法。第一个代表什么?

第一个static const struct my_struct 但我懒得复制'n'paste。所以,你需要:

static const struct my_struct data = { .compute = sin };

或类似的东西(假设您包含<math.h> 以提供sin 的声明 - 或使用您已经声明或定义的其他函数)。如果您在没有 C99 或更高版本的编译器的情况下遇到问题):

static const struct my_struct data = { sin };

你不能在函数之外写作业——那是你的问题。您必须使用初始化程序,或在函数内编写赋值并删除 const

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多