我得到一个文件,其中包含处理不同数字类型数组的通用方法(基本思想在 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/