C宏返回变量类型

时间:2016-03-05 14:22:44

标签: c function types macros

是否可以创建一个宏函数,其返回值是预定义的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;
}

3 个答案:

答案 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

但是,请不要。我很惭愧写下来。