0

我得到了一个文件,其中包含用于处理不同数字类型的数组的通用方法(基本思想在 C 中的伪泛型中描述)。可以通过设置TYPE宏来指定类型。它看起来像这样(只是其中的一部分):

array_analyzers.c

#ifndef TYPE
#error TYPE isn't defined
#endif

#define CONCAT(x, y) x ## y
#define GET_NAME(BASE, TYPE) CONCAT(BASE, TYPE)

TYPE GET_NAME(get_minimum_, TYPE) (TYPE nums[static 1], int len){
    TYPE min = nums[0];

    for (int i = 1; i < len; i++) {
        if (nums[i] < min) {
            min = nums[i];
        }
    }

    return min;
}

#undef CONCAT
#undef GET_NAME
#undef TYPE

现在,我创建了一个如下所示的头文件:

array_analyzers.h

#ifndef TYPE
#error TYPE isn't defined
#endif

#define CONCAT(x, y) x ## y
#define GET_NAME(BASE, TYPE) CONCAT(BASE, TYPE)

TYPE GET_NAME(get_minimum_, TYPE) (TYPE nums[static 1], int len);

#undef CONCAT
#undef GET_NAME
#undef TYPE

最后,我想使用这个main.c

#include <stdio.h>

#define TYPE int
#include "array_analyzers.h"
#define TYPE double
#include "array_analyzers.h"

int main(void){
  int nums[] = {1, 2, 3};
  printf("%i\n", get_minimum_int(nums, 3));
}

但是,我收到以下错误消息:

array_analyzers.c:2:2: error: #error TYPE isn't defined

这里到底有什么问题?当我首先运行预处理器并创建具有正确内容的单独文件时,它可以工作,但这太糟糕了。

4

1 回答 1

3

您没有在范围开头的循环中声明 int,而是在 for 循环中声明。如果您使用 gcc,您可以添加 -std=c99 编译器选项来接受此代码。

在这个函数中是一个应该总是被接受的标准循环。在这个函数中,int i 被声明在作用域的开头。

int
ansi_c (){
    int i;
    for ( i = 0 ; i < 10; i++ ){

    }
}

并且在此函数中是一个循环,仅在添加 -std=c99 或 std=gnu99 时才被接受。此函数在循环内声明 int。

c99(){
    for (int i = 0; i < 10; i++ ){

    }
}
于 2013-05-14T11:50:22.283 回答