所以我在学校的一项编程作业中使用基名遇到问题
我试图使它的版本更简单-但是我使它起作用了,但仍然与我在这种情况下应该做的完全混淆
// $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'
答案 0 :(得分:0)
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函数,您不能更改。 (感谢Nevin!)在联机帮助页上:
dirname()和basename()都可能修改path的内容,因此在调用这些函数之一时可能希望传递副本。
在这种情况下,我建议创建argv0
的副本。最简单的方法是将execname
的签名更改为此:
void exec::execname(std::string argv0)
答案 1 :(得分:0)
我认为您的中心问题是同时包括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>
,然后重试。