我正在制作自己的库,并决定使用宏对其进行配置。简单介绍一下问题:有2个类。BRange 和 BIndex。它们将在未来的类中用作参数(用于索引)。我还希望能够设置从 1 开始的索引。即:1 2 3 4 5,而不是 0 1 2 3 4。为此,我制作了 2 个宏,它们将采用 1 个参数(变量名)并将其带到常规索引。也就是说,如果启用了从 1 开始的索引,那么我只需从数字中减去 1 并获取索引。问题是这样的:出于某种原因,即使在打开此索引后,宏也总是与关闭时相同。我只是不知道该怎么处理它了。最初,我试图摆脱这样一个事实,即包含索引的宏具有一定的价值。在我复制了宏的名称之后,我可能会犯错。将此粘贴到 BIndex.h / Brange.h 文件中。(最初,我为此使用了另一个文件 - BConst.h)。很多次我看着没有逻辑错误。没有什么帮助。我扔掉了截图和项目档案的链接。
如果有的话 - 这不是 IDE 错误。编译的时候,结果也是不正确的:
项目文件链接:https ://drive.google.com/file/d/1mPZuVgL4hEhMc0_xSGsgIqvB_KJboq9I/view?usp=sharing
看,当你编译时
main.cpp
,你BLIB_BINDEX_ADVANCED_INDEXING
定义了一个宏值。例如,当您编译时
bindex.cpp
-您认为它是否已定义?...但是您已链接此代码并从main.cpp
...调用你明白这是怎么回事吗?定义与否
main.cpp
都没有区别BLIB_BINDEX_ADVANCED_INDEXING
!因为它在 中扮演一个角色getindex()
,它是从一个单独编译的文件bindex.cpp
中调用的,它不关心你在那里写了什么main.cpp
...有几种选择:
使用编译器标志设置宏。
制作一个文件 la
blib_config.h
. 在那里转储宏的默认值(作为选项 - 已注释掉),并让用户根据需要更改它们。减号 - 以某种方式手动更改标题并不会真正落在各种包管理器等身上。
或者,大致相同:将文件名放入宏中(连同引号一起,否则将不起作用),并设置条件
#ifdef
,而不是__has_include
- 那么你不需要 C++20。然后默认情况下不会有配置,用户可以根据需要创建它。
最后一个选项是我最喜欢的。
但我不喜欢这个想法本身。这都是一个恶作剧。强制用户使用唯一正确的索引系统(希望为 0,但这取决于您)。
想象一下:另一个库使用您的库,然后某个应用程序同时使用这两个库。您将如何处理派生库和应用程序中的不同设置?建议衍生库的作者将这个索引转换宏粘贴到任何地方?啊。保证有人会忘记它,也许你自己。