我想根据C中的条件声明变量的数据类型。是否可能?
我编写了一个用整数数组实现堆栈的程序, 我想要相同的代码来实现字符堆栈,这只是用“char”替换一些“int”,那么怎么做?
我喜欢这样的东西,
if(x == 1)
#define DATATYPE int
else
#define DATATYPE char
以及许多其他事情,但没有任何效果。
答案 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
)
通常,您可以使用巨大的预处理器宏来实现此类通用容器。参见例如sglib和this question。或者您可以使用一些专门的源代码生成器生成您的C代码(可能使用另一个预处理器,如m4或gpp,或者使用某种脚本语言制作您自己的生成器。)
或者,使用大量void*
指针,并将数据大小传递给您的例程,如qsort(3)。参见例如Glib containers
您可能有兴趣学习C++11或Ocaml(甚至是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;
答案 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