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)
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语法用错了还是函数声明用错了呢?的主要内容,如果未能解决你的问题,请参考以下文章
typedef enum FALSE , TRUE bool ; 求解意思
typedef vs struct/union/enum 背后的基本原理是啥,难道不能只有一个命名空间吗?