[英]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.