c - 使用不同的宏多次包含一个文件

标签 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

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

最佳答案

您不在作用域开头的循环中声明 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++ ){

    }
}

关于c - 使用不同的宏多次包含一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542158/

相关文章:

c - 给定大于 256 的整数,如何在 C 中将整数转换为无符号字符?

c - 多边形的面积和质心

c++ - 在宏定义中使用 __LINE__

c++ - 将外部 .asm 文件包含到 C++ 代码中

C - 我应该使用引号还是括号将标题包含在单独的目录中

c - 数字冒泡排序动态创建的结构数组

c - 使用指针反转字符串

macros - 如何在 Racket 中将 define-syntax 与 syntax-case 分开

xml - 如何处理excel宏中缺少的xml节点

PHP:包含和需要文件时抛出错误