Я пытался создать список общих глобальных функций C для различных классов, и хотя я делал это в прошлом, у этого есть проблемы. Вот части списка .h и .c.
CGGeometry.h
//CDPoint
//////////////////////////////////////////////////////////////////////
typedef struct CDPoint {
CGFloat x, y, z;
} CDPoint;
// Creates a CDPoint from 3 float numbers
CDPoint CDPointMake(float x, float y, float z);
//CDLine
//////////////////////////////////////////////////////////////////////
typedef struct CDLine {
CDPoint a, b;
} CDLine;
// Creates a CDPoint from 2 CDPoints
CDLine CDLineMake(CDPoint a, CDPoint b);
//CDVector
//////////////////////////////////////////////////////////////////////
typedef struct CDVector {
CDPoint start, finish;
CDPoint gradient;
} CDVector;
// Creates a CDVector from 2 CDPoints
CDVector CDVectorMake(CDPoint startPoint, CDPoint endPoint);
// Returns a point travelled to on a given vector, using a start point and a distance scalar.
CDPoint CDVectorTrace(CDVector vecToTrace, CDPoint startPoint, float distance);
//CDExtra
//////////////////////////////////////////////////////////////////////
// This is stuff that shoudn't really be in this section, but are for convenience purposes until it has enough functions to be standalone.
GLfloat* CDMeshColorsCreateGrey(CGFloat bValue, CGFloat vertCount);
CGFloat* CDMeshVertexesCreateRectangle(CGFloat height, CGFloat width);
CDGeometry.c
#include "CDGeometry.h"
//CDGeometry.c
/* A collection of functions and typedefs that aid 2D and 3D environment positioning and provides methods for objects and processes. Also includes elements relevant to collision detection. */
//CDPoint
//////////////////////////////////////////////////////////////////////
CDPoint CDPointMake(float x, float y, float z)
{
return (CDPoint) {x, y, z};
}
//CDLine
//////////////////////////////////////////////////////////////////////
CDLine CDLineMake(CDPoint a, CDPoint b)
{
return (CDLine) {a, b};
}
//CDVector
//////////////////////////////////////////////////////////////////////
CDVector CDVectorMake(CDPoint startPoint, CDPoint endPoint)
{
CDPoint grad = CDPointMake(startPoint.x / endPoint.x,
startPoint.y / endPoint.y,
startPoint.z / endPoint.z);
return (CDVector) {startPoint, endPoint, grad};
}
//CDExtra
/////////////////////////////////////////////////////////////////////
GLfloat* CDMeshColorsCreateGrey(CGFloat bValue, CGFloat vertCount)
{
GLfloat *greyColor = (GLfloat *) malloc(vertCount * 4 * sizeof(GLfloat));
int index = 0;
for (index = 0; index < (vertCount); index++)
{
int position = index * 4;
greyColor[position] = bValue;
greyColor[position + 1] = bValue;
greyColor[position + 2] = bValue;
greyColor[position + 3] = 1.0;
}
return greyColor;
}
CGFloat* CDMeshVertexesCreateRectangle(CGFloat height, CGFloat width) {
CGFloat *squareVertexes = (CGFloat *) malloc(8 * sizeof(CGFloat));
squareVertexes[0] = -(width / 2);
squareVertexes[1] = -(height / 2);
squareVertexes[2] = (width / 2);
squareVertexes[3] = -(height / 2);
squareVertexes[4] = (width / 2);
squareVertexes[5] = (height / 2);
squareVertexes[6] = -(width / 2);
squareVertexes[7] = (height / 2);
return squareVertexes;
}
Когда я не импортирую или какой-либо другой фреймворк, я получаю «Ошибка разбора: имя неизвестного типа» для CGFloat и GLfloat. Когда я делаю это в файле .h, я получаю ошибки Parse и Semantic, где NSString - это неизвестное имя типа внутри фреймворка, а также другие ошибки «Ожидаемый идентификатор или (»).
Мне никогда не приходилось включать этот заголовок в мои исходные списки функций C, я просмотрел другой пример кода от Apple и проверил заголовки в других классах, которые используют эти функции и typedefs, и я не могу найти проблема.