基本名称问题

时间:2019-06-17 21:50:42

标签: c++11 posix

所以我在学校的一项编程作业中使用基名遇到问题

我试图使它的版本更简单-但是我使它起作用了,但仍然与我在这种情况下应该做的完全混淆

// $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 :(得分:0)

basenamechar*作为参数,而不是const,表示允许该函数修改值。

const string& argv0const,这意味着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.hcstring。如果您在这些文件中查看basename的原型,它们是不同的。如果您是在linux上构建的,则您会在libgen.h版本中看到一条注释,该注释应该很有启发性。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/basename.htmlhttps://linux.die.net/man/3/basename在这里也很有用。

我建议移除 #include <libgen.h>,然后重试。