我有这些辅助功能:
<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是否有任何预先定义的功能来处理这个问题?
答案 0 :(得分:1)
libgen.h
是Posix 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());
}
但是,您可能会从dirname
和basename
获得帮助
不值得像这样(或者实际上就像你这样)
试图得到它)。
特别是如果你想要的pathname_directory(pathname)
是pathname
的全部,但不包括最后一个路径分隔符,
你想要的pathname_sans_directory(pathname)
是pathname
的全部内容
在最后一个路径分隔符之后。因为dirname
和basename
然后返回“。”会让你大吃一惊。在你期望空字符串的情况下。
查看dirname
和basename
文档。
如果是这样的话,那么至少麻烦的做法就是自己动手:
#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中的默认值)不允许。