vc140 x64项目缺少c ++ libgen.h(mingw) - 辅助函数

时间:2016-07-04 13:52:35

标签: c++ visual-c++ visual-studio-2015 mingw c++14

我有这些辅助功能:

        <xcdg:Column Title="Registratiedatum" FieldName="RegistratieDatum" Width="1*">
        <xcdg:Column.CellContentTemplate>
            <DataTemplate>
                   <TextBlock Text="{Binding StringFormat='{}{0:dd/MM/yyyy HH:mm:ss }', TargetNullValue={x:Static System:String.Empty}}" />
                </DataTemplate>
        </xcdg:Column.CellContentTemplate>
        </xcdg:Column>

依赖于libgen.h,一个mingw标题。

1)为什么VS为包含“char buffer [pathname.size()+ 1];”的行提供错误“表达式必须具有常量值”?

2)VS 2015是否有任何预先定义的功能来处理这个问题?

2 个答案:

答案 0 :(得分:1)

libgen.hPosix header, 所以问题与mingw无关。

编译器抱怨:

char buffer[pathname.size() + 1];

因为标准C ++(任何标准)禁止可变长度数组(尽管如此) C99允许他们)。

您可以通过重写功能来避免使用VLA:

#include <string>
#include <memory>
#include <algorithm>
#include <libgen.h>

std::string
pathname_directory(const std::string &pathname)
{
    char const *cs = pathname.c_str();
    std::size_t cslen = pathname.size() + 1;
    std::unique_ptr<char[]> pbuf(new char[cslen]);
    std::copy(cs,cs + cslen,pbuf.get());
    return dirname(pbuf.get());
}

std::string
pathname_sans_directory(const std::string &pathname)
{
    char const *cs = pathname.c_str();
    std::size_t cslen = pathname.size() + 1;
    std::unique_ptr<char[]> pbuf(new char[cslen]);
    std::copy(cs,cs + cslen,pbuf.get());
    return basename(pbuf.get());
}

但是,您可能会从dirnamebasename获得帮助 不值得像这样(或者实际上就像你这样) 试图得到它)。

特别是如果你想要的pathname_directory(pathname)pathname的全部,但不包括最后一个路径分隔符, 你想要的pathname_sans_directory(pathname)pathname的全部内容 在最后一个路径分隔符之后。因为dirnamebasename 然后返回“。”会让你大吃一惊。在你期望空字符串的情况下。 查看dirnamebasename 文档。

如果是这样的话,那么至少麻烦的做法就是自己动手:

#include <string>

std::string
pathname_directory(const std::string &pathname)
{
    std::size_t len = pathname.find_last_of("/\\");
    return len == std::string::npos ? "": pathname.substr(0,len);
}

std::string
pathname_sans_directory(const std::string &pathname)
{
    std::size_t len = pathname.find_last_of("/\\");
    return len == std::string::npos ? pathname : pathname.substr(len + 1);
}

答案 1 :(得分:-1)

或者您可以在Windows上使用LLVM(clang)进行编译。您可以将clang作为C ++下Visual Studio安装的一部分进行安装。 Clang允许使用可变长度数组,但MSBuild(Visual Studio中的默认值)不允许。