使用c中的条件声明变量的数据类型

时间:2014-09-25 10:23:13

标签: c variables conditional-statements custom-data-type

我想根据C中的条件声明变量的数据类型。是否可能?

我编写了一个用整数数组实现堆栈的程序, 我想要相同的代码来实现字符堆栈,这只是用“char”替换一些“int”,那么怎么做?

我喜欢这样的东西,

if(x == 1)
#define DATATYPE int
else
#define DATATYPE char

以及许多其他事情,但没有任何效果。

4 个答案:

答案 0 :(得分:5)

如果#if x==1预处理程序符号,则代码可以与#endif ... x一起使用,例如如果使用-Dx=1命令行option汇编到gcc;请理解C preprocessor是C编译器的第一阶段,实际上看到预处理代码(使用例如gcc -C -E source.c > source.i进入source.i预处理表单source.c

通常,您可以使用巨大的预处理器宏来实现此类通用容器。参见例如sglibthis question。或者您可以使用一些专门的源代码生成器生成您的C代码(可能使用另一个预处理器,如m4gpp,或者使用某种脚本语言制作您自己的生成器。)

或者,使用大量void*指针,并将数据大小传递给您的例程,如qsort(3)。参见例如Glib containers

您可能有兴趣学习C++11Ocaml(甚至是Common Lisp)。它们提供了一个标准库,其中包含一些通用containers(在C ++中带有templates的库,在Ocaml中带有functors;另请阅读generic programming

答案 1 :(得分:1)

你可能有一个设计缺陷。您应该问自己为什么要将C威胁为像Python这样的动态语言。 C是静态语言类型,因此类型是固定的。

答案 2 :(得分:1)

使用此解决方案,鼓励您通过为堆栈tagged_t中的每个值创建结构来重新设计,然后填充数据,我希望您能够理解。

    typedef union {
int i;
char c;
float f;
} evil;

typedef struct {
  evil value;
  int type;
} tagged_t;

enum {
  TYPE_INT, TYPE_CHAR, TYPE_FLOAT
};

tagged_t bar;
bar.value.c = 'a';
bar.type = TYPE_CHAR;

See the answer of Yann Ramin

答案 3 :(得分:0)

首先,请了解预处理器。现在,问你的问题。

这不起作用,因为编译器实际上只看到:

if(x == 1)
else

#表示该指令将由预处理器执行。当我们谈论#define命令时,预处理器真的是一个美化的发现和替换。例如:

#define PI_5_DIGITS 3.14159f

预处理器会找到标记PI_5_DIGITS的所有匹配项,并将其替换为3.14159

如果您想使用此功能,请将x作为预处理器符号,方法是添加开关,例如-Dx=1.

然后您的代码需要更改为:

#ifdef x
   #define DATATYPE int
#else
  #define DATATYPE char
#endif

建议阅读:

http://www.phanderson.com/C/preprocess.html http://gcc.gnu.org/onlinedocs/cpp