typedef enum和函数声明的问题,程序如下,是我enum语法用错了还是函数声明用错了呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typedef enum和函数声明的问题,程序如下,是我enum语法用错了还是函数声明用错了呢?相关的知识,希望对你有一定的参考价值。

typedef enum
a,//枚举模式即可
b,
c,
d,
NVM_Mode;(第27行)

void nvm_ModeSet(NVM_Mode mode_name);(第37行)

void nvm_ModeSet(NVM_Mode mode_name)
uint8_t A;
A = mode_name;//寄存器 = mode_name;即可

程序如上,编译会在声明函数那行报错,提示
eeprom.h:18:27: error: (372) "," expected
eeprom.h:18:37: non-expected function declaration for "nvm_ModeSet"
eeprom.h:18:37: error: (313) function body expected
eeprom.c:3:37: error: (987) arguments redeclared
eeprom.c:3:37: error: (1098) conflicting declarations for variable "nvm_ModeSet" (eeprom.c:3)

参考技术A 自定义函数;函数体在main前面,不用声明;如下

void fun()//不用加声明;在main函数后定义函数体,要加;
void fun()
函数体

int main()
return 0;

还有uint8_t,包含在
文件stdint.h中
看是否遗漏#include<stdint.h>
参考技术B 你的片段应该不完整吧?37行前5行,和函数定义5行截屏一下追问

追答

不知道为什么没法打开追问里得图片
第二张图是eeprom.c?
application.h就是你第一张图里得内容?
报错的是左侧中的void nvm_ModeSet(NVM_Mode mode_name);还是哪?

追问

报错的就是第一张图片头文件里面的预先声明的函数,第二张图片是c函数。我不知道我声明的时候enum用法和函数声明没错呀。我直接不用typedef enumNVM_Mode而改用全局枚举enum NVM_Mode,直接使用void 函数名(NVM_Mode)同样也会报错,我是哪里的标点符号写错了嘛?好像解决了,先后顺序出问题了,应该先声明enum的。笑哭ing

追答

总算打开你图片了,你的void nvm_ModeSet(NVM_Mode mode_name);这个声明写再typedef前了,此时编译器还看不到NVM_Mode这个定义。你需要把typedef这段写到函数声明前面

追问

感谢老哥。

本回答被提问者采纳

const 成员函数和 typedef,C++

【中文标题】const 成员函数和 typedef,C++【英文标题】:Const member function and typedef, C++ 【发布时间】:2016-12-14 01:51:12 【问题描述】:

假设我们要通过typedef声明const成员函数:

typedef int FC() const;
typedef int F();

struct A

   FC fc;         // fine, we have 'int fc() const'
   const F f;    // not fine, 'const' is ignored, so we have 'int f()'
;

由于const 被忽略,程序编译得很好。为什么const 被忽略的功能?由于我们可以以这种方式形成 const 指针,我唯一能想到的就是“C 遗产”。标准对此有什么说法吗?

【问题讨论】:

int () const 主要是半类型,因为它可能只适用于具有成员函数的类。 它不能是“C 遗产”,因为 C 没有成员函数。 是的,但是在 C 中我们仍然可以有: typedef int F();常量 F f;即使 'int f() const' 可能在语法上不正确。 有趣的问题。为什么它被否决?似乎F 之前的const 完全被忽略了。我通过打印它的类型进行了检查,并期望它至少可能是const int (A::*)()。但是不,它只是 int (A::*)() 是的,因为 'const' 和 'F' 的顺序不是必需的。 【参考方案1】:

C++ 14 标准,[dcl.fct] pt。 7:

函数声明器中 cv-qualifier-seq 的效果与在顶部添加 cv-qualification 不同 的函数类型。在后一种情况下,将忽略 cv 限定符。 [注意:一个函数类型有一个 cv-qualifier-seq 不是 cv 限定类型;没有 cv 限定的函数类型。 ——尾注]

例子:

typedef void F();

struct S 
    const F f; // OK: equivalent to: void f();
;

所以,这是一个正确的行为。

【讨论】:

【参考方案2】:

此更改由CWG 295 进行,主要是为了简化通用编程。考虑:

template<class F>
void meow(const F& f)  f(); 
void purr();

meow(purr);

忽略额外的const 允许它工作。

【讨论】:

以上是关于typedef enum和函数声明的问题,程序如下,是我enum语法用错了还是函数声明用错了呢?的主要内容,如果未能解决你的问题,请参考以下文章

C语言关键字大全

C语言 enum和typedef enum的区别

typedef enum FALSE , TRUE bool ; 求解意思

typedef vs struct/union/enum 背后的基本原理是啥,难道不能只有一个命名空间吗?

C/c++:语言中关键字typedef(类型重命名)enum(整型常量值集合,代替#define)的使用

C语言中的32个关键字