在C中连接路径有什么好的,跨平台的方法?

Rob*_*ham 4 c cross-platform concatenation path

目前,我有一个path_concat(char* path_fragment_a, char* path_fragment_b)功能,它只是串接在一起path_fragment_a,PATH_DIVIDERpath_fragment_b.(PATH_DIVIDER在#ifdef块中是#defined,所以它\在Windows和/其他任何地方.)

但我不禁想到这似乎:

  • 有点像kludge.
  • 必须由一个相当常见的库覆盖的东西,如果可用的话会更好用,所以我不会重新发明轮子.

谷歌搜索它只是发现了很多关于Python的结果os.path.join(这将是理想的,除了它的Python,而不是C),所以我想知道是否有人知道更清洁/更标准的解决方案.

R..*_*R.. 6

首先,您应该使用snprintf而不是连接操作来一次构造一个字符串.这是安全有效的方式.连接在脚本语言中可能是惯用的,但在C中它是低效且有害的(容易出现危险的错误).

话虽如此,自从第一个版本的DOS具有目录(2或3;我忘记它是什么)'/'以来,已经在DOS上作为路径分隔符有效,并且它在Windows上也一直有效.它没有被使用的唯一原因是在DOS支持的目录之前设计的许多遗留命令行程序'/'在其命令行解析中被解释为"切换"(选项)字符.过去20年中唯一不支持'/'作为路径分隔符的真实世界系统是OSX之前的MacOS,我不认为这是一个可行的目标,所以在我看来,你应该总是使用'/',并避免污染您的代码具有无偿的"可移植性".

  • Python的`os.path.join`有一个特性,如果后续路径以`/`开头,则丢弃所有先前的路径部分.如果你想要将文件名附加到`CWD`(如果它不是以`/`开头),那么这很有用,但如果它以`/`开头则按原样使用它.只使用`snprintf`并没有给你这个. (2认同)