是否可以创建一个宏函数,其返回值是预定义的c变量数据类型之一?类似的东西:
#include <stdio.h>
#define IND_I_ 0
#define IND_F_ 1
#define INT_FORMAT_ "%i"
#define FLOAT_FORMAT_ "%f"
// (Of course the following macros do not make the desired jobs)
// FORMAT_ macro would be used for the variable format:
#define FORMAT_( ind_ )( (ind_) == IND_I_ ? FOR_INT_ : FOR_FLOAT_ )
// VAR_TYPE_ macro would be used for
// defining variable types and for the casting of variables:
#define VAR_TYPE_( ind_ ) ( (ind_) == IND_I_ ? int : float )
int main( void )
{
VAR_TYPE_( IND_I_ ) first_var = 123; //here I want: int first_var = 123;
VAR_TYPE_( IND_F_ ) second_var = 345.789;
//Instead of:
//printf( "int variable = " "%i" "\n", first_var );
//I would use:
printf( "int variable = " FORMAT_(IND_I_) "\n", first_var );
printf( "float variable = " FORMAT_(IND_F_) "\n", second_var );
printf( "truncated real variable = " INT_FORMAT_ "\n", (VAR_TYPE_(IND_I_))second_var );
return 0;
}
答案 0 :(得分:3)
抱歉,在C系列中无法做到这一点。 ( 可能在具有更强大宏系统的语言中,例如Common Lisp和Rust。)
宏唯一能做的就是文本替换。所以你的
#define VAR_TYPE_( ind_ ) ( (ind_) == IND_I_ ? int : float )
#define IND_I_ 0
VAR_TYPE_( IND_I_ ) first_var = 123;
扩展为
( (0) == 0 ) ? int : float ) first_var = 123;
这是一个语法错误。没有办法让它评估?:
表达式。
当VAR_TYPE_
的参数扩展为字面零,一等时,有一件事可以使它工作:
#define VAR_TYPE_(ind_) VAR_TYPE__(ind_)
#define VAR_TYPE__(ind_) VAR_TYPE__##ind_
typedef int VAR_TYPE__0;
typedef float VAR_TYPE__1;
// etc
...但是如果您正在执行此操作,您可能希望允许ind_
为任意整数常量表达式并且不会起作用。你会得到像
VAR_TYPE_sizeof(int)==4?0:2
在扩展中,您将回到语法错误。
(诗篇:每当你在括号内放置空格时,上帝会杀死一只小猫。)
答案 1 :(得分:1)
宏只是文字替换,所以你不能这样做。 使用c ++ 11/14,auto type和outstream句柄都适合。
答案 2 :(得分:0)
简短的回答是:不。
你想达到什么目的?
为什么你需要在C中灵活键入?也许你应该继续使用Java或Python。
在您的示例中,您已经拥有了类型信息,因此使用宏来替换特定于类型的字符串文字是过度的。
如果你想从外部控制变量的类型,我强烈反对,你可以设置宏替换并通过标题注入它们或直接在编译器上指定它们#39 ; s命令行。
示范示例(请不要在家里这样做):
#include <stdio.h>
#include <stdlib.h>
/* // eg.
#define TEH_TYPE double
#define TEH_TYPE_FMT "%f"
#define TEH_TYPE_ATO atof
*/
// Either, or see command line below.
/*
#define TEH_TYPE int
#define TEH_TYPE_FMT "%d"
#define TEH_TYPE_ATO atoi
*/
int main(int argc, char **argv) {
TEH_TYPE v;
if(argc > 1)
{
v = TEH_TYPE_ATO(argv[1]);
printf("So your thingie is " TEH_TYPE_FMT "\n", v);
}
return 0;
}
然后您可以将其编译为gcc -DTEH_TYPE=int -DTEH_TYPE_FMT='"%d"' -DTEH_TYPE_ATO=atoi main.c -o main
。
但是,请不要。我很惭愧写下来。