当前位置: 首页 > 知识库问答 >
问题:

函数指针变量声明中存在拼写错误,但代码已编译

仇建茗
2023-03-14

在回答关于函数指针的问题时,OP这样做是为了声明一个函数指针,该函数指针接受1个整数参数,但不返回任何内容:

void *(intr_handlerptr)(int);  // wrong but compiles!!
intr_handlerptr = intr_handler;  // compiler error: cannot assign to this weird thing (lvalue required as left operand of assignment)

当正确的声明是

void (*intr_handlerptr)(int);  // correct

有趣的是,错误发生在分配给这个函数指针时,而不是在声明它时(使用 gcc 7.3.1 测试)

那么第一行是什么意思呢?

共有1个答案

陈马鲁
2023-03-14

表达式val*(intr_handlerptr)(int);读作"intr_handlerptr是一个函数,它接受一个int并返回一个指向未命名事物的指针(一个空指针)。所以函数名称周围的括号没有用,被丢弃了。这是一个原型。

表达式<code>void(*intr_handlerptr)(int)读取为“intr_handlerptr是一个指向一个函数的指针,该函数接受一个int值,但不返回任何值。括号是将名称与指针类型相关联所必需的。这是一个变量。

赋值给第一个时,编译器抱怨你尝试赋值为“nothing”,因为左手符号不是变量。实际上,编译器在其符号表中只知道该名称的原型。当然,第二个赋值语句是正确的,因为您正在赋值给一个变量。

 类似资料:
  • 问题内容: 我正在学习Google的新语言Go。我只是在尝试一些东西,我注意到,如果您声明一个变量并且不对其执行任何操作,则go编译器(在我的情况下为 8g )将无法 编译,并显示以下错误:。令我惊讶的是,大多数语言编译器只是 警告 您有关未使用的变量,但仍会编译。 无论如何,我能解决这个问题吗?我检查了编译器的文档,但看不到任何会改变此行为的内容。有没有一种方法可以删除以进行编译? 问题答案:

  • 问题内容: 我偶然发现了一个奇怪的问题,下面的代码无法编译: 错误(代码是linter推荐的代码)。: 注意,确实使用了该变量。 但是,如果我添加了else块-一切都会按预期编译: 这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11) 编辑:到目前为止的所有被告。按照:https : //golang.org/ref/spec#Short_variable_decl

  • 在 Gradle 构建脚本中有两种类型的变量可以声明:局部变量 ( local ) 和 扩展属性 ( extra ) .

  • 指针变量的值为内存地址。通常变量直接包含特定值,而指针则包含特定值变量的地址。因此可以说,变量名直接(directly)引用数值,而指针间接(indirectly)引用数值(如图 5.1 通过指针引用数值称为间接引用。 指针和任何其他变量一样,应先声明后使用。下列声明: int *countPtr, count; 声明变量 countPtr 的类型为 int*(即指向整型值的指针),或者说成 co

  • 我使用mariadb和heidisql来执行sql: DECLARE@Account tID INT; 将值('testfirstname','a','testlastname','user@email.com“,1,1,NOW()); set@Account tID=Last_Insert_Id(); 我一直收到一个错误: QL Error(1064):您的SQL语法有错误;查看与您的Maria

  • 主要内容:用数组作函数参数在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的 指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。 有的时候,对于整数、小数

  • 问题内容: 我是golang的新手,我编写了一个测试io包的程序: 编译错误为“已声明并且未使用err”。但是我想我已经使用err来声明。为什么编译器会输出此错误? 问题答案: for 的内部正在遮盖for的外部,并且未被使用(for的内部)。发生这种情况的原因是,您正在使用简短的变量声明(与运算符一起使用),该声明声明了一个新变量,该新变量遮盖了for外部声明的变量。

  • Windows 10、Visual Studio 2019、C 17: 编译错误:无法将参数2从“int(\u cdecl*)(int)”转换为“…” 如果没有模板(int func(int size)),代码编译正常。如何修改它以使编译器理解可变参数?