Это сумасшедшие базовое имя и dirname имеют две версии.
Мы работали над большим проектом, похоже, что эти два API-интерфейса уже вызвали потенциальные ошибки.Поэтому мы пометили «basename» «dirname» как устаревшее для предупреждения, если кто-то его использует:
#ifdef basename
__attribute__ ((deprecated))
char *__xpg_basename(char *path);
#else
__attribute__ ((deprecated))
char *basename(const char *path);
#endif
__attribute__ ((deprecated))
char *dirname(char *path);
Мы также пытаемся представить базовую библиотеку основы c, такую как glib или libcork, но она выглядит слишком тяжелой.Поэтому мы пишем крошечную библиотеку для этой цели, такую реализацию:
#include <libgen.h> // for dirname
#include <linux/limits.h> // for PATH_MAX
#include <stdio.h> // for snprintf
#include <string.h> // for basename
#include <stdbool.h> // for bool
bool get_basename(const char *path, char *name, size_t name_size) {
char path_copy[PATH_MAX] = {'\0'};
strncpy(path_copy, path, sizeof(path_copy) - 1);
return snprintf(name, name_size, "%s", basename(path_copy)) < name_size;
}
bool get_dirname(const char *path, char *name, size_t name_size) {
char path_copy[PATH_MAX] = {'\0'};
strncpy(path_copy, path, sizeof(path_copy) - 1);
return snprintf(name, name_size, "%s", dirname(path_copy)) < name_size;
}
Затем мы заменяем все вызовы basename
dirname
на get_basename
get_dirname
.