使用不同的宏多次包含文件

时间:2013-05-14 11:37:22

标签: c macros include

我有一个文件,其中包含使用不同数字类型的数组的通用方法(基本思想在Pseudo-generics in 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

这到底出了什么问题?它在我首先运行预处理器并使用正确的内容创建单独的文件时起作用,但这很糟糕。

1 个答案:

答案 0 :(得分:3)

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

在这个函数中是一个标准的循环,应该被接受。在此函数中,int在范围的开头声明。

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

    }
}

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

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

    }
}