如何在C中区分数组变量和普通变量与单个结构

时间:2015-06-02 09:47:03

标签: c

我正在尝试将变量名称传递给C代码中的宏。并且需要确定它是否是数组运行时。可以用C吗?

2 个答案:

答案 0 :(得分:2)

通常不可能,但在某些情况下你可以让它发挥作用:

如果数组是静态分配的:

例如pt-BRint 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数组,但只能处理某些约束。当然,它不是很漂亮!