【问题标题】:How to initialize "unsigned char *" with default argument in C++?如何在 C++ 中使用默认参数初始化“unsigned char *”?
【发布时间】:2013-11-28 11:55:44
【问题描述】:

我有一个带有以下签名的方法的类:

void print(unsigned char *word);

我需要将"" 设置为word 的默认值,我该怎么做?

我尝试了明显的void print(unsigned char *word="");,但出现以下错误:

error: cannot initialize a parameter of type
  'unsigned char *' with an lvalue of type 'const char [1]'
    void print(unsigned char *word="");

由于我无法使用字符串文字初始化 word,我应该由谁来初始化?

【问题讨论】:

  • 指针不应该这样初始化
  • 你为什么不想使用std::string
  • 您需要在print() 中更改单词吗?否则写void print(const char *word);
  • 如果您打算更多地使用 C++ 进行编程,那么我会说这是学习标准库及其类和算法的要求。使用标准库将使您作为 C++ 程序员的生活更加轻松,保证!您可能想查看参考网站such as this one 以了解更多关于可用内容的信息。
  • 好吧,因为它是 c++,你可以定义第二个函数 void print(),然后它会调用你的 1 arg 函数 void print(unsigned char *),但是你喜欢。

标签: c++ initialization default-arguments


【解决方案1】:

你说这是一个应用于打印的“前缀”参数。

答案是你应该设置参数const,停止在函数内部对它做任何改变,然后使用""作为默认参数:

void print(const char* prefix = "")

【讨论】:

  • 即使我将所有修改都包含在一个副本中并使这个论点 const 你回答不起作用,因为我仍然需要 unsigned char 并且字符串文字不兼容
  • @RSFalcon7:你“不需要”unsigned char
  • 我愿意,这个问题比我在这里展示的更复杂,unsigned char 不是我的心血来潮
  • @RSFalcon7:然后按照 claptrap 的建议进行操作,但保持const
【解决方案2】:

试试

unsigned char empty[] = { 0 };

void print(unsigned char* word = empty )
{
  ...
}

【讨论】:

  • @Lightness Races in Orbit,你认为给他一个 char* 数组,他只能安全地写入一个字节吗?
  • @RichardPlunkett:好吧,我同意你,既然他想修改这个论点,那么那里可能会有一个漏洞。希望他只在它实际包含文本时对其进行修改。
  • 是的,但是这并不比在 const 内存中拥有 "" 更好,而且可能要糟糕得多。
【解决方案3】:

"" 产生一个 const char 的数组,因此你想要一个 NON-const unsigned char 的数组或指针,类型和 cv 限定都不合适。

另请注意,在 C++ 中 char != signed charchar != unsigned char

您的意思可能是void print(const char *word);,但可能您想要只是print(std::string const &)print(std::string)

【讨论】:

  • @RSFalcon7 您不能使用字符串文字(即const)初始化指向非常量字符的指针。
  • @RSFalcon7:“我不想要任何 const 类型”,为什么?
  • @RSFalcon7 你的print 函数修改了传递给它的数据?提醒我不要使用你的 API :)
  • @RSFalcon7:为什么函数print修改它的参数?
  • @RSFalcon7:那么答案是在函数内部修改这个参数,取一个const char* prefix = ""。就是
【解决方案4】:
 void print();
 void print(unsigned char* prefix);
 // in cpp file:
 void print(){
   unsigned char temp = 0;
   print(&temp);
 }

这提供了两个重载,一个带有 0,一个带有一个参数。

零参数一有一些自动存储内存,它提供给一参数一。请注意,只有指针下的单个字节对读/写有效:没有长度,print 无论如何也无法知道任何不同。

虽然没有数组,但单个元素不需要数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2017-08-15
    相关资源
    最近更新 更多