我正在尝试将变量名称传递给C代码中的宏。并且需要确定它是否是数组运行时。可以用C吗?
答案 0 :(得分:2)
通常不可能,但在某些情况下你可以让它发挥作用:
例如pt-BR
或int arr[N];
:
int arr[] = {1,2,3};
这是有效的,因为如果数组声明如上,#define IS_ARRAY(x) ((void*)(x) == (void*)&(x))
与arr
和&arr
相同。这是因为虽然数组确实充当指针,但实际上没有为该指针分配内存,因此您无法获取它的地址。 &arr[0]
运算符返回第一个元素的地址。
如果您的数组实际上是一个指针,例如&
将int *arr = malloc(3*sizeof(int));
功能用于类型通用表达式,您可以执行以下操作:
C11
这将仅针对#define IS_ARRAY(x) _Generic((x), default:1,char:0,short:0,int:0,long:0,float:0,double:0,long double:0)
的那些类型返回0,并且对于任何其他类型(包括数组)将返回1.
为了完整起见,我列出了这个:
x
如果您的数组被分配使得它比所有非数组变量都大,那么这将是真的。不过,在所有情况下,最好使用第一种方法。
答案 1 :(得分:0)
实际上,我认为评论非常正确如果您完全控制代码并且可以锁定某些内容 - 即数组的类型和某些内容对数据大小的限制。看一个人为的例子比较容易:
#include <stdio.h>
int array[10] = {0};
int not_array = 10;
#define PRINT_RESULT( x ) do { \
if( sizeof( x ) == sizeof( int ) ) { \
printf( "Int result: %d\n", (int)x ); \
} else { \
printf( "Array result: " ); \
for( int _i = 0; _i < ( sizeof( x ) / sizeof( ((int*)x)[0] ) ); _i++ ) { \
printf( "%02X ", ((int*)x)[_i] ); \
} \
printf( "\n" ); \
} } while( 0 )
int main( int argc, char* argv[] )
{
PRINT_RESULT( not_array );
PRINT_RESULT( array );
return 0;
}
使用gcc -Wall -std=gnu99 main.c
运行并获取:
Int result: 10
Array result: 00 00 00 00 00 00 00 00 00 00
通过这种方式,宏确实可以处理int或int数组,但只能处理某些约束。当然,它不是很漂亮!