【问题标题】:Initialization of const char array as argument of an overloaded function将 const char 数组初始化为重载函数的参数
【发布时间】:2017-02-17 17:34:45
【问题描述】:

这会编译,但肯定不正确,我有奇怪的输出。 如果有人能告诉我正确的方法,我会很高兴。

void test(const char c[]={'\0'});       //It will compile but strange outputs
//void test(const char c[]={'x','\0'});   //compile error

void loop() {
  const char c[] = {'u','h','u','\0'};

  test();
  test(c);
}

void test(const char c[]){
  Serial.println(c);
}

【问题讨论】:

  • 很抱歉给您带来了困惑。我正在使用 arduino 环境并且它已经接受(没有警告,没有错误),但这只是一个抽象的代码片段,在我的原始代码中我当然使用其他名称;)
  • 我猜这是一个 Arduino C++ 问题

标签: c++ arrays char initialization constants


【解决方案1】:

默认初始化为零可能不是您想要的。您实际上将默认值指向 NULL 而不是空字符串,因为 const char c[] 在用作函数参数时被编译器视为 const char *c

你可以的

void test(const char *c=""); 

相反。

我假设您使用的是 C++ 编译器,我建议您将问题标记为 C++,因为 C 没有默认参数或多态性。

至于c[]参数中的语法和行为你可以找到一个很好的讨论here

正如 CisNOTthatGOODbutISOisTHATBAD 所指出的,将 c 声明为数组以避免进一步混淆是一种不好的做法。因此,虽然const char c[]="" 也可以,但这不是一个好主意。

【讨论】:

  • 好的。非常感谢,它有效?。好像是一个针对C/C++的avr-g++编译器,下次会记住的。
  • const char c[]=""const char c[]={'\0'}; 是完全等价的,不是吗?另一方面,const char c[] = NULL; 不是,因为后者将指针 c 设置为 NULL(这不是空字符串的有效内存地址)。
  • 空字符串是保存\0的内存地址。这是我建议更改的,因为在这种情况下 {'0'} 被编译为字符。事实上,在我回答这个问题之前,我尝试在 gcc 6.2 中编译原始代码,如果没有 -fpermissive 标志,它会给我一个“从 char 到 char * 的无效转换”消息。 (与 x86-64 gcc 6.2 一起使用 gcc.godbolt.org)。我想当它是一个参数时,规则略有不同,但我没有检查 C++ 规范,所以我不确定......
  • 哦,你是对的! +1。是的,const char[] 衰减为const char*,然后{'\0'} 被视为char 0,即NULL。然后,当 OP 显示它时,std::cout 会设置它的错误标志,因此之后不会显示任何其他内容。
  • 当我说“函数中的参数基本上是同一件事”时,我实际上认为已经足够清楚了。不过,我会详细说明答案。感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2017-08-11
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多