我正在尝试从多个宏/值创建一个字符串,以便在#include
中使用。我这样做是为了在简单的状态系统中清理一些初始状态的代码。
我有2个默认的,可重新定义的宏(如果没有定义那么是默认值)
#define DEFAULT_STATE StateName // name of class
#define DEFAULT_STATE_LOCATION states/ // location of header file from root
从root
的文件4文件夹中使用include指令,因此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
的源,我可以每次都省略重新定义的常量。
我没有在.h
宏中包含DEFAULT_STATE
,因为我使用相同的宏来创建默认状态和实例。
我尝试过使用串联##
和stringize运算符,以及我在网上找到的一些技巧,但没有任何效果。
如果需要,我可以在自己的宏中定义../../../../
和.h
。
但只是
#define DEFAULT_STATE_INCLUDE ../../../../ ## DEFAULT_STATE_LOCATION ## DEFAULT_STATE ## .h
#include #DEFAULT_STATE_INCLUDE
给出了大量错误。
感谢任何帮助。 感谢
答案 0 :(得分:1)
您最好使用-I
选项
-I../../../..
来自gcc手册页:
-I dir
Add the directory dir to the list of directories to be searched for header files.
答案 1 :(得分:1)
这似乎相关:Computed Includes
我的解读是#define宏必须包含“(quote)字符,并且你不能依赖stringize或concatenation运算符为你做这些。
答案 2 :(得分:1)
请注意,C99标准第6.10.2节“源文件包含”中的脚注143说:
143)请注意,相邻的字符串文字不会连接成单个字符串文字(请参阅翻译 5.1.1.2)中的阶段;因此,导致两个字符串文字的扩展是无效的指令。
因此,任何字符串连接都必须在源代码之外完成。与##
的令牌连接不是一种选择;用于构建标识符,并且您要加入的标题名称的位不是标识符。
我认为你应该简单地使用类似的东西:
#ifndef STATE_HEADER
#define STATE_HEADER "states/StateName.h"
#endif
#include STATE_HEADER
并将其留给构建系统而不是源代码,以确定编译器需要-I../../../..
。