All++:C++ 简单条件

Omnet++: C++ simple condition

条件不成立执行else的可能原因是什么

IPassiveQueue *queueModule = nullptr;    
queueModule = nullptr;
    if (queueModule == nullptr) {...}
    else {...}

[edit1] 根据下面的答案,我在这里添加我试图强制条件为真的原因

下面的代码总是检查第一个条件并执行其他条件。它处于初始化状态,因此它不依赖于任何先前执行的 class 并且 queueModule 成员在 class 定义中设置为受保护成员

class INET_API EtherMACBase : public MACBase
{virtual void initializeQueueModule(); 
IPassiveQueue *queueModule = nullptr;
...}

void EtherMACBase::initializeQueueModule()
{
    queueModule = nullptr;
    if (par("queueModule").stringValue()[0]) {...}

    else {...}

 }

虽然在这种情况下条件为真,但参数设置为相同

class INET_API PPP : public MACBase
{
  protected:
    IPassiveQueue *queueModule = nullptr;
    virtual void initialize(int stage) override;
    ...
}

void PPP::initialize(int stage)
{
     queueModule = nullptr;
     if (par("queueModule").stringValue()[0]) {...}

     else {...}
}

[edit2] This picture for Debugging asked by Jerzy D.

您的问题是 INET.
NED 文件中 PPP 和以太网接口的默认队列类型声明不同的结果 查看这两个文件:src/inet/linklayer/ppp/PPPInterface.nedsrc/inet/linklayer/ethernet/EthernetInterface.ned。这些文件的关键部分如下。

module PPPInterface like IWiredNic
{
    parameters:
        string queueType = default("DropTailQueue"); 
    submodules:
        queue: <queueType> like IOutputQueue if queueType != "" {
        }
        ppp: PPP {
            parameters:
                queueModule = (queueType == "" ? "" : "^.queue");
        }
}

module EthernetInterface like IWiredNic
{
    parameters:
        string queueType = default(""); 
    submodules:
        queue: EtherQoSQueue if queueType != "" {
        }
        mac: <macType> like IEtherMAC {
            parameters:
                queueModule = (queueType == "" ? "" : "^.queue");
        }
}

可以注意到 PPPInterface queueType 参数分配了 默认值,因此有一个队列子模块以及参数 queueModule 不为空。
但是EthernetInterface没有queueType的值,所以没有queue子模块,参数queueModule为空串。读取空字符串的 [0] 元素结果为 0(假)。