变量的替代声明取决于if条件

时间:2017-10-30 16:57:27

标签: c if-statement variable-declaration

我想有,如果我是1然后是一个int类型,否则作为char类型,但是当我编译这个代码然后遇到以下错误:

> 1.c: In function ‘main’:
> 1.c:18:16: error: ‘a’ undeclared (first use in this function)
>              if(a)
>                 ^
> 1.c:18:16: note: each undeclared identifier is reported only once for each function it appears in



  #include <stdio.h>
    #define macro
    void main()
    {
        int i=1;
    #ifdef macro
        if (i==1)
        {
            int a;
        }
        else
    #endif
        {
            char a;
        }
        if(a)
        {
        printf("INDOE ");
        }
    }

4 个答案:

答案 0 :(得分:3)

  

我想拥有as,如果i为1则为int类型,否则为char类型

停在这里,编译的C代码不知道类型,所以你不能在运行时设置一个类型 - 它已经在你编译程序时“硬编码”了。

旁注:

    {
        char a;
    }
    if(a)

大括号为变量提供范围,因此在结束括号后,a不再存在。

有很多方法可以解决这个问题,它们都涉及到您存储自己的类型信息。粗略的想法:

enum mytype { MT_INT, MT_CHAR };

struct myvalue {
    enum mytype type;
    union {
        int a_int;
        char a_char;
    };
};


[...]

struct myvalue x;
// [...]
if (i==1) x.type = MT_INT;
else x.type = MT_CHAR;
// [...]

然后,在x.a_intx.a_char的每次访问中,首先检查x.type以了解要访问的成员。

答案 1 :(得分:0)

C中变量的范围仅限于您声明的块。 int a仅在if中可用。 char a只能在else

中使用

答案 2 :(得分:0)

搜索“范围”概念。在范围内定义的C中的变量将无法在其外部或上述范围内访问,但可在以下范围内访问。

答案 3 :(得分:0)

看起来你希望你的condtional由预处理器处理。例如

 #include <stdio.h>

#define i 1

#if i
#define ATYPE int
#else
#define ATYPE char
#endif
int main(int argc, char* args)
    {
        ATYPE a;
        printf("%d\n", sizeof(a));
    }

我当然不会推荐#define'ing i,但这看起来有点像你想要做的。