Проблема с базовым именем - PullRequest
0 голосов
/ 18 июня 2019

Поэтому у меня возникла проблема с использованием базового имени для одного из моих заданий по программированию для школы

Я попытался заставить работать более простую версию - я получил ее, однако, все еще не совсем понял, что я должен делать в этом случае

// $Id: util.cpp,v 1.1 2016-06-14 18:19:17-07 - - $
#include <libgen.h>
#include <cstring>
using namespace std;

#include "util.h"

ydc_exn::ydc_exn (const string& what): runtime_error (what) {
}

string exec::execname_; // Must be initialized from main().
int exec::status_ = EXIT_SUCCESS;

void exec::execname (const string& argv0) {
   execname_ = basename (argv0.c_str());
   cout << boolalpha;
   cerr << boolalpha;
   DEBUGF ('Y', "execname = " << execname_);
}

void exec::status (int new_status) {
   new_status &= 0xFF;
   if (status_ < new_status) status_ = new_status;
}

ostream& note() {
   return cerr << exec::execname() << ": ";
}

ostream& error() {
   exec::status (EXIT_FAILURE);
   return note();
}

Просто пытаюсь получить код для компиляции --- мое сообщение об ошибке в c ++:

' 
util.cpp:15:16: error: no matching function for call to 'basename'
   execname_ = basename (argv0.c_str());
               ^~~~~~~~
/usr/include/libgen.h:40:7: note: candidate function not viable: 1st argument ('const std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>
      >::value_type *' (aka 'const char *')) would lose const qualifier
char    *basename(char *);
         ^
1 error generated.
make: *** [util.o] Error 1'

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Я думаю, что ваша центральная проблема включает в себя libgen.h, а также cstring.Если вы посмотрите на прототипы basename в этих файлах, они будут другими.Если вы строите это на Linux, вы увидите комментарий в версии libgen.h, который должен быть поучительным.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/basename.html и https://linux.die.net/man/3/basename также полезны здесь.

Я предлагаю удалить #include <libgen.h> и повторить попытку.

0 голосов
/ 18 июня 2019

basename принимает char* в качестве аргумента, который не является const, что означает, что функции разрешено изменять значение.

const string& argv0 равно const, что означает, что значение argv0 нельзя изменять.

Таким образом, вам не разрешено вызывать basename с argv0.c_str() в качестве параметра, поскольку это нарушит квалификатор const.

Сообщение об ошибке ясно: 1st argument ... would lose const qualifier.

Так что либо измените argv0, чтобы оно не было const (вероятно, не очень хорошая идея), либо измените basename, чтобы принять параметр const char* (вероятно, лучшая идея), или измените basename работать с std::string вместо char*, как остальная часть вашего кода (вероятно, лучшая идея).

Так что, очевидно, basename - это функция Unix, которую вы не можете изменить. (Спасибо, Невин!) Из справочной страницы:

И dirname (), и basename () могут изменять содержимое пути, поэтому может потребоваться передать копию при вызове одной из этих функций.

В этом случае я рекомендую создать копию argv0. Самый простой способ сделать это - изменить подпись execname на эту:

void exec::execname(std::string argv0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...