【发布时间】:2017-01-15 23:10:07
【问题描述】:
编辑#1:添加最小重复,见下文:
背景
我正在尝试将我的代码分割成多个 .cpp 文件,所有这些文件都应该可以访问 enum 类型,我认为我是在头文件中声明,然后包括在许多cpp 文件中。
但是,当我尝试将它们链接在一起时,我会收到 multiple definition 或 not defined 错误。我认为这源于我对 declaration 是什么以及 definition 是什么的可能的误解。我的意思是我很清楚这个(reference):
- 当编译器为变量分配存储空间时,就定义了一个变量。
- 当编译器被告知变量存在时声明变量(这是它的类型);那时它不会为变量分配存储空间。
问题
如果我的main.h 文件中有这个,这显然只是一个声明,不是吗?
#1
enum operation_status {
PRE_START,
RUNNING,
PAUSED
};
那么这个呢?这是声明还是定义?
#2
operation_status op_status;
我认为这确实是一个声明,与之相关的定义是
#3
op_status = PRE_START;
提前感谢您的回答!
可重现的例子:
Main.h
enum operation_status {
PRE_START,
RUNNING,
PAUSED
};
//error given by this: 'multiple definition of op_status'
operation_status op_status;
//error given by this: 'undefined reference to op_status'
extern operation_status op_status;
void changeStatus();
Main.cpp
#include <Arduino.h>
#include <main.h>
void setup() {
op_status = PRE_START;
}
void loop() {
;
}
Change.cpp
#include <main.h>
void changeStatus() {
op_status = RUNNING;
}
解决此问题的最佳解决方案是什么?谢谢!
【问题讨论】:
-
为什么不分享一个最小的例子来展示你正在经历的令人不安的行为呢?这也可能有助于en.wikipedia.org/wiki/One_Definition_Rule
-
添加了示例。抱歉,我认为解释很清楚。
-
第一个 sn-p 既不声明也不定义变量。您将在每本 C++ 书籍中找到详细信息(尽管 Arduino 并不完全是 C++)。
-
该问题是通用 C++ 问题,不需要标记 [embedded] 或 [arduino]
标签: c++ enums arduino embedded