c/c++语言开发共享如何在标准C / C ++中获取文件分隔符号:/或?

我想写一个函数:

inline char separator() { /* SOMETHING */ } 

在标准C / C ++ / C ++ 11中返回系统的文件分隔符? (我的意思是斜杠或反斜杠取决于系统)。 有没有办法实现这个目标?

    除了通过检查ifdef,我不知道该怎么做

     inline char separator() { #ifdef _WIN32 return '\'; #else return '/'; #endif } 

    或(由PaperBirdMaster建议)

     const char kPathSeparator = #ifdef _WIN32 '\'; #else '/'; #endif 

    这可能是这样的

     #if defined(WIN32) || defined(_WIN32) #define PATH_SEPARATOR "\" #else #define PATH_SEPARATOR "/" #endif 

    这个问题真的暗示了一个更糟糕的问题。

    如果您只关心UNIX与Winodws并且您只关心目录和文件,那么您已经看到的(大多数)将会工作,但是将路径名拼接到其组件中的更通用的问题是一个更加丑陋的问题。 根据平台,路径可能包括以下一项或多项:

    虽然有第三方库(如各种CPAN Perl模块,Boost等),并且每个操作系统都包含系统function,但是没有内置于C的C ++标准只获得了这个function(通过合并) 2017年的Boost模块)。

    这种function可能需要处理的一些例子是:

    还有很多其他的。

    值得注意的是,C ++ 17文件系统库并未涵盖所有这些可能性。 std::filesystem::path由可选的根名称 (卷标识符),可选的根目录 (用于标识绝对路径)和由目录分隔符分隔的文件名序列组成。 这涵盖了在UNIX平台上可能有效的所有内容以及其他平台的大多数用例,但并不全面。 例如,它没有任何子流支持(依靠操作系统以某种方式将它们映射到文件名 – 这是由Mac OS X完成的,但不是经典的MacOS)。 它也不包括对文件版本号的支持。

    另请参阅Wikipedia在Path和C ++ 17 std :: filesystem :: path类上的条目

    我建议您查看目标分隔符要执行的操作(提取基本名称,将路径分解为目录列表等)并编写一个函数来执行此操作。 如果您正在使用C ++ 17(并且您确定您的代码不会被17之前的C ++编译器编译),那么您可以(可能)使用标准C ++库代码来编写此函数的可移植实现。 如果没有,该函数将需要为您将支持的每个平台使用特定于平台的#ifdef ,如果没有满足任何条件,则使用#error ,强制您为意外平台添加条件。

    或者使用包含所有这些function的第三方库(如Boost),如果可以接受的话。

    接受的答案在Cygwin下不起作用。 在Windows上运行的Cygwin编译程序可以使用Windows样式的’’分隔符,但它没有定义_WIN32等。 在Cygwin下运行的修改后的解决方案:

     inline char separator() { #if defined _WIN32 || defined __CYGWIN__ return '\'; #else return '/'; #endif } 

    要么

     const char kPathSeparator = #if defined _WIN32 || defined __CYGWIN__ '\'; #else '/'; #endif 

    如果您的编译器已经提供了c ++ 17function,那么您可以使用std::experimental::filesystem::path::preferred_separator ,它应该返回/具体取决于您的平台。

    有关更多信息,请参阅此

    我很惊讶没有人提供以下内容。 这构建了其他人在这里提供的东西。

    虽然在这个例子中我试图动态获取正在运行的可执行文件的名称,但是跳转并根据需要重新应用它并不困难。

    Windows使用正斜杠来表示参数。 所以你可以在第一个参数argv[0] ,它包含正在运行的程序的名称。

    请注意以下结果是剥离最后一个斜杠之前的路径名,而将sepd为程序的文件名。

     #include  #include  int main(int argc, char *argv[]){ //int a = 1 //int this = (a == 1) ? 20 : 30; //ternary operator //is a==1 ? If yes then 'this' = 20, or else 'this' = 30 char *sepd = (strrchr(argv[0], '/') != NULL) ? strrchr(argv[0], '/') : strrchr(argv[0], '\'); printf("%snn", sepd); printf("usage: .%s  nn", sepd); while (getchar() != 'n'); } 

    但实际上,这是非常肮脏的,并且随着Windows最近采取措施包括Bash(此时尚未实施),这可能会产生意外或意外的结果。

    它也不像其他人提供的那样理智和不受错误,特别是#ifdef _WIN32

      以上就是c/c++开发分享如何在标准C / C ++中获取文件分隔符号:/或?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/572336.html

      (0)
      上一篇 2021年3月4日
      下一篇 2021年3月4日

      精彩推荐