Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么定义在子类中没有正确定义?_C++_C Preprocessor - Fatal编程技术网

C++ 为什么定义在子类中没有正确定义?

C++ 为什么定义在子类中没有正确定义?,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

我在基类头文件中有一个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();
  ...
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:谢谢,改进了我的答案。答案很好,但不是根本原因。