簡體   English   中英

C宏返回的變量類型

[英]C macro returning type of variable

是否可以創建一個宏函數,其返回值是預定義的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;
}

抱歉,這在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_的參數擴展為文字的零, 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

在擴展中,您將回到語法錯誤。

(附言:每當您在括號內放置空格時,上帝就會殺死一只小貓。)

宏只是文字上的替換,因此您不能這樣做。 使用c ++ 11/14,將適合自動類型和下游句柄。

最簡潔的答案是不。

您想實現什么?
為什么需要在C中靈活輸入? 也許您應該接着使用Java或Python。

在您的示例中,您已經具有類型信息,因此使用宏替換特定於類型的字符串文字是過分的。

如果您要從外部控制變量的類型( 我強烈反對) ,則可以設置宏替代,並通過標頭注入它們,或在編譯器的命令行中直接指定它們。

演示示例(請不要在家中進行此操作):

#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

但同樣,請不要。 我以寫下來為恥。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM