为什么 #define 子类中没有正确定义
Why is #define not properly defined in child classes?
我在基类头文件中有一个定义。在派生类中使用定义是不可能的:
插件.h
#ifndef PLUGIN_H
#define PLUGIN_H
#include "../config.h"
#ifdef DEBUG
#define DEBUG_PLUGIN(...) ets_printf( __VA_ARGS__ )
#else
#define DEBUG_PLUGIN(...)
#endif
class Plugin {
public:
Plugin();
...
简单插件.h
#ifndef SIMPLE_PLUGIN_H
#define SIMPLE_PLUGIN_H
#include "Plugin.h"
class SimplePlugin : public Plugin {
public:
SimplePlugin();
...
简单插件.cpp
#include "SimplePlugin.h"
SimplePlugin::SimplePlugin() : _devices() {
DEBUG_PLUGIN("[SimplePlugin]n"); // <-- not printed
}
config.h
DEBUG
定义。你能强调一下预处理器的魔力吗?
更新
这些评论让我走上了正确的轨道。宏扩展当然不依赖于类层次结构,实际上根本不依赖于编译器,而是依赖于预处理器。宏是由预处理器和执行来定义和扩展的,否则我们会看到编译错误。
最终发现,Arduino/esp8266 ets_printf
功能需要额外的硬件配置,否则它只能不可靠地工作。这种不可靠的行为使它看起来好像只是根据文件/类层次结构中的位置来调用它。
是的,你应该阅读更多关于 C/C++ 预处理器的信息(C 和 C++ 共享相同的预处理器,预定义宏存在一些差异(。它仅以文本方式操作。它没有类型的概念(例如 class
(,或范围。
您可以使用命令行获取预处理形式的SimplePlugin.cpp
,如下所示:
g++ -C -E SimplePlugin.cpp > SimplePlugin.ii
(您可能必须在-C
之前添加一些额外的-D
符号和-I
目录,就像在编译命令中一样(
然后,使用编辑器或寻呼机查看生成的SimplePlugin.ii
文件(来自SimplePlugin.cpp
的预处理表单...(。
您甚至可以删除行信息(由预处理器在以 #
开头的行中发出(
g++ -C -E SimplePlugin.cpp | grep -v '^#' > SimplePlugin.nolines.ii
然后你可以运行g++ -c -Wall SimplePlugin.nolines.ii
,诊断将引用预处理的文件SimplePlugin.nolines.ii
,而不是原始的未预处理SimplePlugin.cpp
另请阅读 GNU cpp 的文档
(我猜你使用GCC;请根据你的编译器套件调整我的答案;我什至猜测您的错误可能与预处理无关(
显而易见的可能解释是
-
ets_printf()
- 这是非标准的,你没有描述 - 不像你认为的那样工作。 例如,它本身可能是一个宏,如果定义了宏DEBUG
则定义为不执行任何操作。 -
DEBUG
实际上并没有在您的config.h
中定义。 某处的拼写错误很容易意味着正在定义其他宏,而不是您认为的宏。 - 标头实际上可能正在定义
DEBUG
但预处理器随后遇到#undef DEBUG
。 这可能在同一个标头中,不同的标头中,甚至在包含源文件中。
该问题不太可能与类或构造函数的定义有任何关系。 预处理器不遵循作用域规则。
- 找不到 #define 的函数定义
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- #define DATA 10 和 # (如果定义了 DATA)之间的差异
- 已经在 .obj 中定义,即使有 #ifndef #define #endif
- 如何比较 #define 定义的字符串和整数
- 如何将定义(#define some_define)作为函数的参数传递
- 如何使用'#define';定义一个宏来执行多个方法
- 是否可以为 #define 分配定义的结果?
- 当定义与运算符有价值时,#define 如何在编程中工作
- 在运行时重新定义 c++ 中的 #define
- #Define USE_SQLDB(定义(USE_SQLITE)||定义(USE_MYSQL))
- 使用来自其他方法和 #define 的函数定义常量
- #define变量在windows.h中被忽略并重新定义
- 在cpp中用#define定义函数
- 重新定义(#define)保留的c++关键字
- 使用 #define 来定义静态数组的大小是否合法?
- g++链接错误:使用#define编写函数名称时,未定义对函数的引用
- 定义类型的正确方式(typedef与#define)
- 在 #define 中定义的最大值无法正常工作
- 使用 #undefine 而不首先定义 (#define) 宏的效果