如何将const char*指针传递给fts_open()函数

6
如何将const char * path传递给fts_open?我想要传递一个文件路径(filePath)。

1
我认为这个线程的最佳答案中有一个很好的示例:https://dev59.com/WXNA5IYBdhLWcg3wYMx- - Mikhail
3个回答

3

fts_open函数需要一个char*类型的数组,以便与main函数的argv数组兼容(由于char**无法转换为char const**)。

因此,您需要创建这样的数组。特别是,如果您有一个路径保存在char const*变量中,您必须复制该字符串;例如:

char path_copy[PATH_MAX];
strcpy(path_copy, path);
char *argv[] = {path_copy, NULL};
FTS *fts = fts_open(argv, FTS_PHYSICAL, nullptr);

这里使用了静态大小的缓冲区。根据您的要求,您可能需要动态分配适当大小的缓冲区。取决于您的需求

... 可能(甚至很可能)fts_open不会实际修改其参数,因此强制转换掉const而不是复制字符串应该是可行的。但是,fts_open的文档没有提供这样的保证,所以我建议不要这样做。


2
我假设您想知道如何将此单个路径传递给fts_openargv参数(类型为char const **)。该参数的描述如下:

argv

是一个以NULL结尾的字符指针数组,命名了构成文件层次结构的一个或多个路径。

因此,您需要创建一个长度为2的数组,其元素的类型为char*。将您的路径放在第一个元素中,并将NULL放在第二个元素中。就像这样:
char const *argv[] = { path, NULL };

现在您可以将argv传递给fts_open


5
дёҚиҝҮпјҢfts_openеҮҪж•°еҸӘжҺҘеҸ—char *const *еҸӮж•°иҖҢдёҚжҳҜconst char *const *еҸӮж•°гҖӮ :-/ - jørgensen
你可以将非const指针传递给接受const指针的函数。在常量性正确性中,函数签名告诉您函数不会修改参数所指向的数据。在这种情况下,fts_open不会修改argv的内容,也不会修改它的元素指向的值。 - tomlogic
但是在我的原始版本中有些粗心。我现在已经添加了适当的“const”限定符。话虽如此,我怀疑“const”的存在只会让Helium3更难理解双重间接性。为了说明问题,有时候一次只关注一个问题可能会更好。 - David Heffernan
2
这个不起作用fts_open需要一个(常量)指向char *的指针,而不是指向char const *的指针。 - Konrad Rudolph

0

fts_open()的第一个参数是“以空指针结尾的字符指针数组,命名了构成文件层次结构的一个或多个路径。”

因此,您可以像这样传递它:

char *pathlist[2];

pathlist[0] = filePath;
pathlist[1] = NULL;

fts_open( pathlist, ...);

如果 filePath 的类型是 char const*,那么这个方法就不起作用。 - Konrad Rudolph
没错。fts_open()的函数原型期望第一个参数是char * const *path_argv。根据cdecl.org,这是一个“指向常量指针的指针”,你不能传递“指向常量指向常量字符”的指针。有没有其他方法可以编写代码,以便将const char *pathlist[]传递给fts_open()而不会强制转换掉const - tomlogic
我知道的仅有两种方法:(a) 取消常量性强制转换,这可能在此处未定义(‘fts_open’的文档不能保证它会起作用!),或者 (b) 复制——详见我的回答。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接