【发布时间】:2016-02-04 20:17:27
【问题描述】:
我在基类头文件中有一个定义。无法在派生类中使用定义:
插件.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();
...
SimplePlugin.h
#ifndef SIMPLE_PLUGIN_H
#define SIMPLE_PLUGIN_H
#include "Plugin.h"
class SimplePlugin : public Plugin {
public:
SimplePlugin();
...
SimplePlugin.cpp
#include "SimplePlugin.h"
SimplePlugin::SimplePlugin() : _devices() {
DEBUG_PLUGIN("[SimplePlugin]\n"); // <-- not printed
}
config.h 定义了DEBUG。你能强调一下预处理器的魔力吗?
更新
cmets 让我走上了正轨。宏扩展当然不依赖于类层次结构,实际上根本不依赖于编译器,而是依赖于预处理器。宏被定义,由预处理器扩展,否则我们会看到编译错误。
终于发现 Arduino/esp8266 ets_printf 功能需要额外的硬件配置,否则只会运行不可靠。这种不可靠的行为使它看起来好像只是根据文件/类层次结构中的位置来调用它。
【问题讨论】:
-
你确定ets_printf函数能正常工作吗?
-
你真的创建了 SimplePlugin 的实例吗?
-
宏的行为与类和派生无关。但是,您的头文件包含结构看起来不错,这意味着该宏很可能按应有的方式工作和工作。如果在您的情况下“未打印”某些内容,则不应归咎于预处理器和宏。
-
如果没有定义 amacro,你会得到编译错误,不会丢失运行可执行文件的输出。
-
问题可能出在
config.h的某个地方,因为问题似乎是在编译器到达DEBUG_PLUGIN在Plugin.h中的定义时还没有定义DEBUG。我在 TutorialsPoint 的在线编译器中使用与您的问题相同的文件设置对其进行了测试,并且它有效。 (请参阅 goo.gl/a8MtrF ,尽管您可能需要先g++ main.cpp SimplePlugin.cpp才能运行a.out。)
标签: c++ c-preprocessor