C在switch case中初始化struct

时间:2016-10-12 18:35:01

标签: c gcc switch-statement

所以我的代码中有以下“形状”:

mystruct t;
switch(something){
    case THIS:
        t = {/*initialization*/};
        break;
    case THAT:
        t = {/*initialization*/};
        break;           
    case AND_THE_OTHER:
        t = {/*initialization*/};
        break;
}

gcc坚持在{

之前应该有一个表达式
error: expected expression before '{' token
    t = {
        ^

为什么呢? gcc认为我在做什么?干净的方法是什么?

2 个答案:

答案 0 :(得分:2)

您正在做的是分配,而不是初始化。初始化只能在定义变量时执行。大括号可用于初始化变量,但不能分配。

您需要单独指定结构的每个成员。

答案 1 :(得分:2)

使用compound literals

int EXT_REF Java_JNITest_CallJava(
    JNIEnv* i_pjenv, 
    jobject i_jobject
)
{
    jclass      jcSystem;
    jmethodID   jmidGetProperty;
    LPWSTR      wszPropName = L"java.version";

    jcSystem = i_pjenv->FindClass("java/lang/System");
    if(NULL == jcSystem)
    {
        return -1;
    }
    jmidGetProperty = i_pjenv->GetStaticMethodID(jcSystem,
                      "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
    if(NULL == jmidGetProperty)
    {
        return -1;
    }

    jstring joStringPropName = i_pjenv->NewString((const jchar*)wszPropName, wcslen(wszPropName));
    jstring joStringPropVal  = (jstring)i_pjenv->CallStaticObjectMethod(jcSystem, 
                               jmidGetProperty, (jstring)joStringPropName);
    const jchar* jcVal = i_pjenv->GetStringChars(joStringPropVal, JNI_FALSE);
    printf("%ws = %ws\n", wszPropName, jcVal);
    i_pjenv->ReleaseStringChars(joStringPropVal, jcVal);
    return 0;
}

C99 +支持此功能,但GCC支持C90扩展。