【问题标题】:C++ Multiple enum elements being passed as parameter? [duplicate]C ++多个枚举元素作为参数传递? [复制]
【发布时间】:2026-01-11 13:10:01
【问题描述】:

我一直试图弄清楚我要转换为 JAVA 的这部分 C++ 代码。方法调用PrintItem()DWORD 作为第二个参数,但在这个特定示例中,它允许同时来自enum 的两个元素?

我参考了Ashishfollowing answer 试图得到一些澄清,但这并没有太大帮助。

enum
    {
        PRINT_ENTRY         = 0x0001,
        PRINT_PREPEND       = 0x0002,
        PRINT_APPEND        = 0x0004,
        PRINT_PRECOMMENTS   = 0x0008,
        PRINT_POSTCOMMENTS  = 0x0010,
        PRINT_SPECIAL       = 0x0010,
        PRINT_DEFAULT       = PRINT_ENTRY | PRINT_PREPEND | PRINT_APPEND | PRINT_PRECOMMENTS | PRINT_POSTCOMMENTS | PRINT_SPECIAL
    };

传入两个枚举元素的方法调用?这是我不明白的。

bResult = PrintItem( pMergeItem, PRINT_PREPEND | PRINT_ENTRY );

方法声明

bool PrintItem( CItem* pItem, DWORD options = PRINT_DEFAULT );

还有定义,稍微精简一下:

// Prints an individual item to the invoice (based on appropriate template settings)
bool CPrintRptInvoice::PrintItem( CItem* pItem, DWORD options )
{
    bool bResult = true;
    CString strKey = GetItemKey( pItem );

    DWORD getOpts = CPrintTemplate::GE_NONE;
    if ( options & PRINT_ENTRY )
        getOpts |= CPrintTemplate::GE_ENTRY;
    if ( options & PRINT_PREPEND )
        getOpts |= CPrintTemplate::GE_PREPEND;
    if ( options & PRINT_APPEND )
        getOpts |= CPrintTemplate::GE_APPEND;

    CString strEntry = m_pTemplate->GetEntry( strKey, getOpts );

    // print any prefix first
    if ( options & PRINT_PRECOMMENTS ) 
        PrintComment( pItem->GetInvoicePrefix() );

    // print main entry
    if ( strEntry.IsEmpty() )
    {
        if ( ( options & PRINT_ENTRY ) && !m_pTemplate->EntryExists( strKey ) )
        {
            //Code to print Entries, not touching options anymore.
        }
    }

    // print any special cases
    if ( bResult && ( options & PRINT_SPECIAL ) )
    {
        //Code to print special cases, not touching options anymore...
    }

    // print any suffix last
    if ( options & PRINT_POSTCOMMENTS ) 
        PrintComment( pItem->GetInvoiceSuffix() );

    return bResult;
}

我的问题是 - 它如何处理枚举的多个参数?我没有看到它处理该方法定义中的任何内容!我剪掉的东西根本没有触及options

我想我很困惑,因为我将options 视为某种集合,不是吗?那么,您如何做到这一点并获得正确的元素:if ( options & PRINT_PRECOMMENTS )..

【问题讨论】:

    标签: c++ enums


    【解决方案1】:

    这只是一个按位的OR,它允许将多个枚举值组合成整数,即在内部(因此在函数调用中仍然只有一个参数)。这样的枚举也称为标志集。它们通常以具有仅代表一位的值的成员为特征:a = 1, b = 2, c = 4, d = 8, e = 16, ...因此它们可以组合; a | b 转换为 int 时为 3。 在函数体内部,使用按位 & 运算符分别查询各个标志。

    其他参考:How to use enums as flags in C++?

    顺便说一句。这个概念在 Java 中似乎很相似:Implementing a bitfield using java enums

    【讨论】:

    • 谢谢你,你把它分解得很好。我想我很难找到这方面的信息,因为我不确定它叫什么,在 Java 中可以正常工作!