我想有,如果我是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 ");
}
}
答案 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_int
或x.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,但这看起来有点像你想要做的。