简单代码问题 - 未定义的标识符

时间:2015-02-27 15:16:15

标签: c++ code-composer

我的代码遇到了问题,请参阅以下代码段:

bool flag = false;

if(flag==false)
{ 
int var=0;
flag=true;
}

if(flag==true)
{
var=10;
}

在这种情况下,var被标记为未定义,CCS生成错误,这是完全正确的。只要在if情况中定义变量,就不会向外部知道。在这种情况下,您肯定可以重写代码。但是在我的实际代码中,我要使用非默认构造函数从类构建一个对象,除了使用if情况之外无法解决(至少我不知道如何)

我的实际代码:

SelectedSocket2=VCRT_selectset(&MasterSocket,1,-1); 

if((SelectedSocket != VCRT_SOCKET_ERROR) && (SelectedSocket != 0))
{
ClientSocket=accept(MasterSocket, NULL, NULL);
CStreamer    Streamer(ClientSocket);                  
CRtspSession RtspSession(ClientSocket,&Streamer);          
flag=true;
}
//Streamer, RtspSession are outside unknown and CCS generates an error

我是如何解决问题或欺骗编译器的?

2 个答案:

答案 0 :(得分:2)

您可以使用动态分配来完成条件构造:

std::unique_ptr<CStreamer> Streamer;
if (...) {
    Streamer = make_unique<CStreamer>(ClientSocket);
}

if (Streamer) Streamer->something();

请记住,由于对象是有条件构造的,因此它只存在于该分支所采用的内容中。所以在使用之前你需要额外的条件(或者在else分支上构建它)。

另一种方法是boost::optional。它不需要动态分配。您也可以使用缓冲区和新位置自行滚动。对齐时要小心。

答案 1 :(得分:1)

此代码段应该更好用:

bool flag = false;
int  var  = 0;

if (flag == false)
{ 
    var = 0;
    flag = true;
}

if (flag == true)
{
    var = 10;
}

在您的代码段中,varif范围内(在其关联的{}之间)声明。达到第一个}时会被销毁。如果你希望它保持活力超过第一个,你必须在外面宣布它。

编辑:

使用没有动态分配的指针(使用char []伪造分配):

  // Allocate the needed size for CStreamer (Statically
  char _dummyCStreamer[sizeof(CStreamer)];
  // Same for CRtspSession
  char _dummyCRtspSession[sizeof(CRtspSession)];
  SelectedSocket2 = VCRT_selectset(&MasterSocket, 1, -1);

  // The following two lines are the trick
  CStreamer *streamerPtr = (CStreamer *)_dummyCStreamer;
  CRtspSession *RtspSessionPtr = (CRtspSession *)_dummyCRtspSession;

  // Go ahead, you can now consider your two pointer as if they were statically allowed
  if ((SelectedSocket != VCRT_SOCKET_ERROR) && (SelectedSocket != 0))
  {
    ClientSocket = accept(MasterSocket, NULL, NULL);
    CStreamer    Streamer(ClientSocket);
    CRtspSession RtspSession(ClientSocket, &Streamer);
    streamerPtr->operator=(Streamer);
    sessionPtr->operator=(RtspSession);
    flag = true;
  }

请注意,streamerPtrRtspSessionPtr的有效期限为_dummyCStreamer_dummyCRtspSession。 (分别) 当然,你的类必须实现一个合适的operator =。