C++ 为什么定义在子类中没有正确定义?
我在基类头文件中有一个define。无法在派生类中使用定义: Plugin.hC++ 为什么定义在子类中没有正确定义?,c++,c-preprocessor,C++,C Preprocessor,我在基类头文件中有一个define。无法在派生类中使用定义: Plugin.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(); ... Sim
#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已定义调试。你能突出预处理器的魔力吗
更新
这些评论使我走上了正确的道路。宏扩展当然不依赖于类层次结构,事实上根本不依赖于编译器,而是依赖于预处理器。宏由预处理器定义、展开并执行,否则我们将看到编译错误
最终证明,Arduino/esp8266 ets_printf功能需要额外的硬件配置,否则只能不可靠地工作。这种不可靠的行为使它看起来像是只根据文件/类层次结构中的位置调用。 < P>是的,您应该阅读更多关于C+C++共享同一预处理器的信息,其中包含预定义宏。它只在文本上运行。它没有类型的概念,例如类或范围 您可以使用以下命令行获取SimplePlugin.cpp的预处理表单:
g++ -C -E SimplePlugin.cpp > SimplePlugin.ii
您可能需要在-C之前添加一些额外的-Dsymbol和-Idirectory,就像在编译命令中一样
然后,查看生成的SimplePlugin.ii文件以及SimplePlugin.cpp中预处理的表单。。。使用编辑器或寻呼机
甚至可以删除预处理器在以开头的行中发出的行信息
然后您可以运行g++-c-Wall SimplePlugin.nolines.ii,诊断将引用预处理的文件SimplePlugin.nolines.ii,而不是原始的未处理的SimplePlugin.cpp
#include "SimplePlugin.h"
SimplePlugin::SimplePlugin() : _devices() {
DEBUG_PLUGIN("[SimplePlugin]\n"); // <-- not printed
}
另请阅读
我猜你用的是;请根据您的编译器套件调整我的答案;我甚至猜测您的bug可能与预处理无关,很明显,可能的解释是 ets_printf——这是非标准的,您没有描述过——并不像您所相信的那样工作。例如,它本身可能是一个宏,如果定义了DEBUG,则定义为不执行任何操作。 调试实际上没有在config.h中定义。某个地方的输入错误很容易意味着正在定义其他宏,而不是您认为的宏。 标头实际上可能正在定义调试,但预处理器随后会遇到未定义调试。可能在同一个头文件中,也可能在不同的头文件中,甚至可能在包含源文件中。
问题不太可能与类或构造函数的定义有关。预处理器不遵循作用域规则 您确定ets_printf函数工作正常吗?您确实创建了SimplePlugin的实例吗?宏的行为与类和派生无关。但是,您的头文件包含结构看起来很好,这意味着宏很可能正常工作。如果您的案例中没有打印某些内容,则预处理器和宏不应为此负责。如果未定义amacro,则会出现编译错误,而不会丢失运行可执行文件的输出。问题可能出现在config.h中的某个位置,因为问题似乎是编译器在PLUGIN.h中调试插件的定义时并没有定义DEBUG。我在TutorialsPoint的在线编译器中使用与您的问题相同的文件设置对其进行了测试,结果成功了。请参阅,虽然您可能需要g++Me.cpSimePuxLuin .CPP,然后才能运行.Out.C和C++预处理器有很多相同之处,但实际上并不相同。有很多关于的讨论,例如@Peter:谢谢,改进了我的答案。答案很好,但不是根本原因。