如何在C++中使用默认参数初始化“unsigned char *”?

3

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

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,那我该怎么做呢?


指针不应该以那种方式初始化。 - Suvarna Pattayil
为什么你不想使用 std::string - Some programmer dude
1
如果你想要在C++编程方面更进一步,那么我会说学习标准库、它的类和算法是必不可少的。使用标准库将会使你作为一个C++程序员的生活变得非常轻松,这是毋庸置疑的!你可能需要查看一些参考网站(比如这个)来了解更多可用的内容。 - Some programmer dude
@JoachimPileborg 感谢您提供的参考,还有这个 - RSFalcon7
3
好的,既然这是C++语言,你可以定义第二个函数void print(),然后按照你的需求调用你的1个参数函数void print(unsigned char*)。不过要确保不改变原始意思。 - RichardPlunkett
显示剩余3条评论
4个回答

7

尝试

unsigned char empty[] = { 0 };

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

@Lightness Races in Orbit,你觉得给他一个char *数组,让他只能安全地写入一个字节,这样可以吗? - RichardPlunkett
@RichardPlunkett:好的,我同意你的看法。既然他想修改这个参数,那么可能存在漏洞。希望在参数包含文本时才会进行修改。 - Lightness Races in Orbit
是的,但这样做并不比在const内存中有“”更好,甚至可能更糟。 - RichardPlunkett

7
你说这是一个“前缀”参数,用于打印输出。
答案是你应该将这个参数设置为const,停止在函数内部进行任何更改,并使用""作为默认参数。
void print(const char* prefix = "")

即使我将所有修改都包装在副本中,并将此参数设置为“const”,您的答案也无法工作,因为我仍然需要“unsigned char”,而字符串字面量不兼容。 - RSFalcon7
@RSFalcon7:你不是“需要” unsigned char - Lightness Races in Orbit
我知道,这个问题比我在这里展示的要复杂得多,而且 unsigned char 不仅仅是我的一个奇想。 - RSFalcon7
@RSFalcon7:那就按照 claptrap 的建议去做,但要保持它是“const”。 - Lightness Races in Orbit

4
"" 会产生一个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)

4
你不能用字符串字面值(即 const)来初始化一个指向非常量字符的指针。我建议将它翻译成:无法使用字符串字面值(const)来初始化指向非常量字符的指针。 - Angew is no longer proud of SO
1
@RSFalcon7:为什么你不想要任何const类型? - Moo-Juice
5
你的 print 函数会修改传递给它的数据吗?提醒我不要使用你的 API :) - Moo-Juice
2
@RSFalcon7:为什么一个函数 print修改 它的参数? - Lightness Races in Orbit
2
@RSFalcon7:那么答案就是在函数内不要修改这个参数,并使用 const char* prefix = ""。这就是全部了。 - Lightness Races in Orbit
显示剩余7条评论

0
 void print();
 void print(unsigned char* prefix);
 // in cpp file:
 void print(){
   unsigned char temp = 0;
   print(&temp);
 }

这提供了两种重载,一种是没有参数的,一种是有一个参数的。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接