C++ 默认标签在switch语句中显然不起作用

C++ 默认标签在switch语句中显然不起作用,c++,arduino,switch-statement,arduino-c++,C++,Arduino,Switch Statement,Arduino C++,我在相关帖子上看到了一些关于这个问题的答案,但并不是我问题的答案。这是我的密码: #include <VirtualWire.h> uint8_t RFbuff[VW_MAX_MESSAGE_LEN]; uint8_t RFbuflen = VW_MAX_MESSAGE_LEN; const int REMOTE = 0; String remoteScriptName(){ String scriptName; switch(REMOTE){ case 1

我在相关帖子上看到了一些关于这个问题的答案,但并不是我问题的答案。这是我的密码:

#include <VirtualWire.h>
uint8_t RFbuff[VW_MAX_MESSAGE_LEN];   
uint8_t RFbuflen = VW_MAX_MESSAGE_LEN;
const int REMOTE = 0; 
String remoteScriptName(){
  String scriptName;
  switch(REMOTE){

    case 1:
      vw_get_message(RFbuff, &RFbuflen);
      String RFSTRBUFF = RFbuff;
      scriptName = RFSTRBUFF; 
      delay(1200);
      break;
    default:
      scriptName = "script"; 
      delay(500); 
    }
  return(scriptName);
}

void setup() {
  pinMode(LED_BUILTIN, HIGH);
  switch(REMOTE){
    case 1:
      vw_set_rx_pin(8);
      vw_setup(2000);
      vw_rx_start();
      break; 
    default: 
      digitalWrite(LED_BUILTIN, LOW); 
      delay(500);
      digitalWrite(LED_BUILTIN, HIGH);
      delay(500);
      digitalWrite(LED_BUILTIN, LOW); 
      delay(500);
      digitalWrite(LED_BUILTIN, HIGH);
  }
}

void loop(){}
#包括
uint8_t RFbuff[大众最大消息长度];
uint8\u t RFbuflen=VW\u最大消息长度;
远程常数int=0;
字符串remoteScriptName(){
字符串脚本名;
开关(远程){
案例1:
vw_获取_消息(RFbuff和RFbuflen);
字符串RFSTRBUFF=RFbuff;
scriptName=RFSTRBUFF;
延迟(1200);
打破
违约:
scriptName=“script”;
延迟(500);
}
返回(脚本名称);
}
无效设置(){
pinMode(内置LED灯,高电平);
开关(远程){
案例1:
vw_设置_接收_引脚(8);
大众汽车公司成立(2000年);
vw_接收_启动();
打破
违约:
数码写入(LED内置,低电平);
延迟(500);
数码写入(LED内置,高);
延迟(500);
数码写入(LED内置,低电平);
延迟(500);
数码写入(LED内置,高);
}
}
void loop(){}
switch(REMOTE)
remoteScriptName()
函数中,有
大小写:
默认值:
。当我将代码上传到Arduino micro时,它会跳过
开关(远程)
中的
默认值。
但是在
void setup
中,我有相同的switch语句,但是在这种情况下(上传代码后),它确实执行
默认值:


我对
switch()
没有太多经验,所以任何推荐都很受欢迎

范围可能不够,因此请尝试每种情况

//..

     case 1:{
          vw_get_message(RFbuff, &RFbuflen);
          String RFSTRBUFF = RFbuff;
          scriptName = RFSTRBUFF; 
          delay(1200);
       }
          break;
        default:
          scriptName = "script"; 
          delay(500); 
        }
 //...

你的问题促使我提供一份带有存根的代码副本

在Lubuntu 18.10上开发

使用g++(Ubuntu 9.2.1-9ubuntu2)9.2.1 20191008



执行输出(存根),包括posix时间测量

  pinMode(11,10)
  digitalWrite  (11,5)
  digitalWrite  (11,10)
  digitalWrite  (11,5)
  digitalWrite  (11,10)

  F838_t::exec() duration 2,000,584,200 ns    (201703)

Compilation finished at Sat Dec 28 11:06:06

如果只有一个选项,那么if else可能会有所帮助?只是为了确保,您知道只有
案例
默认
部分中的一个将被正确执行?它不像控件在默认情况下到达
default
主体…您确定这是您正在执行的实际代码吗?您是否曾经尝试过在这里简化它,并在这个过程中剥离出实际的违规代码?您如何知道哪个部件正在运行?内存(特别是
REMOTE
的值)会被程序中其他地方的错误损坏吗?您如何知道默认情况会被跳过?如果是,那么
return(scriptName)
返回什么?此代码不编译。看见仅供参考-我使用“存根”帮助在我的桌面上为桌面编译此代码。启用了错误和警告的编译器可以报告a)“错误:跳转到大小写标签”和b)“注意:交叉初始化'std::string RFSTRBUFF'”将大括号添加到switch语句修复了这些问题。可能还有其他错误。
time make CC='g++ $(m) -O0 ' dumy838 ; ./dumy838

>>>cvs-tools/lmbm/src800/Makefile.i686

R_exe: dumy838.cc
rm -f dumy838
g++ -std=c++17 -m64 -ggdb -O3 -Wall -Wextra -Wshadow -pedantic -Werror=vla 
-Wcast-align -Wcast-qual -Wconversion -Wsign-conversion -Wsign-compare 
-Wsign-promo -Wpointer-arith -Wunused -Wold-style-cast -Woverloaded-virtual
-Wsequence-point -Wdelete-incomplete -Wmaybe-uninitialized 
-Wmisleading-indentation -Wunreachable-code -Wnon-virtual-dtor 
-MMD -MP -O0   dumy838.cc  -o dumy838 
-L../../bag/src -lbag_i686 -lrt -pthread -lncurses -lgmpxx -lgmp

real    0m1.506s
user    0m1.289s
sys 0m0.181s
  pinMode(11,10)
  digitalWrite  (11,5)
  digitalWrite  (11,10)
  digitalWrite  (11,5)
  digitalWrite  (11,10)

  F838_t::exec() duration 2,000,584,200 ns    (201703)

Compilation finished at Sat Dec 28 11:06:06