gpt4 book ai didi

c++ - 在类声明/定义中包含标题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:33 25 4
gpt4 key购买 nike

我知道你可以这样做:

定义.h:

A();
int x;

啊啊

class A
{
public:
#include "def.h"
}

A.cpp

A::A()
{
x = 0;
}

int main()
{
A a;
return 0;
}

我的问题是:您为什么要这样做?有什么优势吗?我知道如果你有一些成员相同但基数不同的类会有多大帮助,但这值得麻烦吗?它不是很可读,是吗?另外,编译器如何处理这些包含?它只是将 header 的内容粘贴到包含它的位置(有点像宏)吗?

最佳答案

我从来没有在类里面看到过这种情况,如果你前几天还想理解代码,我建议你永远不要这样做。

也就是说,有一种情况我认为这种技术是可以接受的,那就是当你有一个大表时,你需要从中生成多个结构,如枚举和属性表。让我们有两个文件,例如:

foobars.h:

enum Foobars {
#define FOOBAR(id, description, args) FOOBAR_##id,
#include "foobars.tab"
#undef FOOBAR
};

extern const char *foobar_names[];
const char *parse_foobar(Foobars fb, const char *input);

foobars.cpp:

#include "foobars.h"
const char *foobar_names[] = {
#define FOOBAR(id, description, args) description,
#include "foobars.tab"
#undef FOOBAR
};

const char *parse_foobar(Foobars fb, const char *input) {
switch(fb) {
#define INT get_int(&input)
#define FLOAT get_float(&input)
#define STRING get_string(&input)
#define FOOBAR(id, description, args) args
#include "foobars.tab"
#undef FOOBAR
}
return input;

神奇之处在于“foobars.tab”(它很特别,所以我建议不要将其命名为 anything.h 或 anything.hpp 或任何其他常见后缀):

/* CAUTION! This file is included using C preprocessor in the middle of various structures
* It must not contain anything except definitions of foobars in the FOOBAR macro and
* comments. Don't forget NOT to write semicolons; some of the structures are
* comma-separated and some semicolon-separated. FOOBAR will be defined appropriately before
* including this file. */
FOOBAR(NULL, "Empty command, does nothing", {}) // NO semicolon!
// Also some preprocessors don't like empty arguments, so that's why {}.
// (void)0 is an alternative.
FOOBAR(FOO, "Foo bars and bazes", a = INT; b = STRING)
FOOBAR(BAR, "Bars, but does not baz", x = FLOAT)
...

另一个选项是为特殊包含的内容定义一个宏。如果表格很短,宏更容易阅读,但如果文件很长,则特殊文件更有意义。

最后一个选项是让表格采用完全不同的格式并生成代码,但这涉及编写一些特殊的脚本来构建它,而这并没有。

关于c++ - 在类声明/定义中包含标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7347033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com