gpt4 book ai didi

c++ - 为#include 连接和字符串化宏值

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:07 27 4
gpt4 key购买 nike

我正在尝试从多个宏/值创建一个字符串以用于 #include。我这样做是为了清理简单状态系统中初始状态的一些代码。

我有 2 个默认的、可重新定义的宏(如果未定义,则有一个默认值)

   #define DEFAULT_STATE          StateName    // name of class
#define DEFAULT_STATE_LOCATION states/ // location of header file from root

include 指令从 root 的 4 个文件夹中使用,因此 include 应该如下所示

#include "../../../../states/StateName.h"

基于上面的例子。

所以我想从这 4 个值定义一个宏。

../../../../
DEFAULT_STATE_LOCATION
DEFAULT_STATE
.h

进入一些宏,比如 DEFAULT_STATE_INCLUDE

我可以说

#include #DEFAULT_STATE_INCLUDE
(to stringize the value for quotes)

这样我就可以更改默认状态和前缀头中默认状态的头文件根目录的路径,并且不必更新使用#include 的源,我每次都可以从重新定义中省略常量。

我没有在 DEFAULT_STATE 宏中包含 .h,因为我使用相同的宏来创建默认状态的实例。

我试过使用连接 ## 和字符串化运算符,以及我在网上找到的一些技巧,但没有任何效果。

如果需要,我可以在它们自己的宏中定义 ../../../../.h

但简单

    #define DEFAULT_STATE_INCLUDE ../../../../ ## DEFAULT_STATE_LOCATION ## DEFAULT_STATE ## .h
#include #DEFAULT_STATE_INCLUDE

给出大量错误。

感谢任何帮助。谢谢

最佳答案

请注意,C99 标准第 6.10.2 节“源文件包含”中的脚注 143 说:

143) Note that adjacent string literals are not concatenated into a single string literal (see the translation phases in 5.1.1.2); thus, an expansion that results in two string literals is an invalid directive.

因此,任何字符串连接都必须在源代码之外完成。不能选择使用 ## 进行标记连接;用于构建标识符,而您加入的 header 名称的位不是标识符。

我认为你应该简单地使用类似的东西:

#ifndef STATE_HEADER
#define STATE_HEADER "states/StateName.h"
#endif
#include STATE_HEADER

并将其留给构建系统,而不是源代码,以确定 -I../../../.. 是否需要作为编译器的一个选项。

关于c++ - 为#include 连接和字符串化宏值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8782343/

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