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

C 使用不同的宏多次包含一个文件,c,macros,include,C,Macros,Include,我得到了一个文件,其中包含处理不同数字类型数组的通用方法(基本思想在中介绍)。可以通过设置类型宏来指定类型。看起来是这样的(只是其中的一部分): array\u 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

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

array\u 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
#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));
}
最后,我想使用
main.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
#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));
}

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

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

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

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

    }
}
int
ansi_c(){
int i;
对于(i=0;i<10;i++){
}
}
在这个函数中有一个循环,它只有在-std=c99或std=gnu99时才被接受 增加了。此函数在循环中声明int

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

    }
}
c99(){
对于(int i=0;i<10;i++){
}
}

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

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

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

    }
}
int
ansi_c(){
int i;
对于(i=0;i<10;i++){
}
}
在这个函数中有一个循环,它只有在-std=c99或std=gnu99时才被接受 增加了。此函数在循环中声明int

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

    }
}
c99(){
对于(int i=0;i<10;i++){
}
}

听起来好像您正试图在非C99模式下编译
阵列分析仪.c
。正如错误消息所说。这听起来不像是任何处理器前的毛茸茸的问题实际上是你的问题来源…听起来像是你试图在非C99模式下编译
array\u analysers.c
。正如错误消息所说。这听起来不像是任何处理器前的毛茸茸的问题实际上是来自…这是正确的答案,但现在我面临着下一个错误。更新了问题。这是正确的答案,但现在我面临下一个错误。更新了问题。