gpt4 book ai didi

c - 是否有一种干净的可移植方式来处理 "build"包含文件名

转载 作者:行者123 更新时间:2023-11-30 17:12:56 25 4
gpt4 key购买 nike

许多C项目都有一英里长的“包含”目录列表,并且C源文件通常在其包含指令中包含棘手的相对路径。当不同目录中的文件(可能用于不同目的)具有相同的名称时,这有时会导致歧义,并且还可能导致编译速度缓慢,因为编译器必须在许多位置搜索每个 #include 文件.

一种概念上更简洁的方法是为每个项目指定一个#include 搜索目录,其中包含一个filepaths.h 文件,该文件将为所有目录定义宏,其中包含驻留在其中的文件,以便项目中任何位置的代码都可以显示类似的内容

#include IO_INCLUDES(serialports.h)
#include IO_INCLUDES(timer.h)
#include FILESYS_INCLUDES(filesystem.h)
#include FILESYS_INCLUDES(dirhandling.h)

可能带有引号;可能没有。如果 C#include "string1""string2" 定义为等同于 #include "string1string2",则以这种方式处理包含文件路径将是很容易,但事实并非如此(在这种情况下,宏可以接受用引号括起来的参数,并且宏可以简单地在前面添加合适的路径名,也在引号中),但事实并非如此。

一种几乎有效的方法是定义如下内容:

... within a filepaths.h file
#define QUOTE(x) #x
#define MQUOTE(x) QUOTE(x)
#define DUP(x) x
#define MAKENAME(file,path) MQUOTE(DUP(file)DUP(path))

#define IO_INCLUDES(name) MAKENAME(d:/shared_libraries/io,name)
#define FILESYS_INCLUDES(name) MAKENAME(d:/shared_libraries/filesys,name)

... within an individual C file
#include IO_INCLUDES(serialport.h)

GCC 似乎接受这一点,并具有适当的所需语义,如果预处理器没有专门识别路径名组件。然而,要求项目文件必须存储在名称与任何宏或预处理器可能识别的其他任何内容都不匹配的路径中似乎并不合理。

是否有任何安全且可移植的方法允许 filepaths.h 文件指示应从中检索文件的目录?预处理器接受 #include 指令中的宏这一事实表明,某些此类功能是有意为之的,但我无法找到任何方法使其安全工作。有吗?

最佳答案

没有。根据C99 6.10.2第4段,“将 < 和 > 预处理标记对或一对 "字符之间的一系列预处理标记组合成单个 header 名称预处理标记的方法是实现定义的”,因此任何这样做的尝试都将是不可移植的。

您基本上有两个选择。如果您确实希望对目录名称完全没有限制,那么您需要使用单独的程序来完成这部分预处理。 Make 本身可能就足够了;像 m4 这样的东西在这里就太过分了。

另一种选择,也是我推荐的,就是建立一个基本的命名约定。使所有宏名称全部大写,所有目录名称不全部大写。然后在其他任何 header 之前包含您自己的 header ,这样您就无需担心其他人为宏命名的内容,问题就消失了。

关于c - 是否有一种干净的可移植方式来处理 "build"包含文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31168025/

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