Makefile error while using struct (error: unknown type name ‘cmplx’)

Makefile error while using struct (error: unknown type name ‘cmplx’)

我正在尝试为多个 c 文件制作 Makefile

这是生成文件:

CC = gcc
CFLAGS = -Wall -lm
objects = N_1_Contg_FD_Ysparse.o Complex_Operations.o B_Calc_FD.o Excel_Input.o FDLoadFlow.o Matrix_Operations.o PI_Calc.o Ybus_Calc.o YbusLineAddEdit.o YbusLineRemoveEdit.o  
output: $(objects)
    $(CC) -g $(objects) -o output -lm
N_1_Contg_FD_Ysparse.o: N_1_Contg_FD_Ysparse.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c N_1_Contg_FD_Ysparse.c
Complex_Operations.o: Complex_Operations.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c Complex_Operations.c
B_Calc_FD.o: B_Calc_FD.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c B_Calc_FD.c
Excel_Input.o: Excel_Input.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c Excel_Input.c
FDLoadFlow.o: FDLoadFlow.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c FDLoadFlow.c
Matrix_Operations.o: Matrix_Operations.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c Matrix_Operations.c
PI_Calc.o: PI_Calc.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c PI_Calc.c
Ybus_Calc.o: Ybus_Calc.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c Ybus_Calc.c
YbusLineAddEdit.o: YbusLineAddEdit.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c YbusLineAddEdit.c
YbusLineRemoveEdit.o: YbusLineRemoveEdit.c Modules_Declaration_Sparsity.h
    $(CC) $(CFLAGS) -c YbusLineRemoveEdit.c

所以目前我正面临这个错误:

Ybus_Calc.c:17:15: error: unknown type name ‘cmplx’
   17 | void Ybuscalc(cmplx** Ytemp, float** linedata, int nbus, int lnsz)

此时编译时出现:

gcc -Wall -lm -c Ybus_Calc.c

这里是N_1_Contg_FD_Ysparse.c(main函数)包含的头文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>

#include "Complex_Operations.c"
#include "Matrix_Operations.c"

#include "Excel_Input.c"
#include "Ybus_Calc.c"
#include "B_Calc_FD.c"
#include "FDLoadFlow.c"
#include "PI_Calc.c"
#include "YbusLineRemoveEdit.c"
#include "YbusLineAddEdit.c"



void datasize(char fl_name[], int* rw, int* clm);
void readcsvfile(float** dat, char fl_name[], int rw, int clm);
void Ybuscalc(cmplx** Ytemp, float** linedata, int nbus, int lnsz);
void B_Calc_Decoup(float** B1, float** B2, int nbus, int nload, float** loaddata, float** Ymag, float** tetha, float* V, float* delta);
void B_Calc_FD(float** B1, float** B2, int nbus, int nload, float** loaddata, float** Ymag, float** tetha);
void fastdecoupledanalysis(float** gendata, float** loaddata, int nbus, int ngen, int nload, float** Ymag, float** theta, float** B1, float** B2, float* V, float* delta, float* P, float* Q);
void PI_Calc(float** linedata, float** Y1mag, float** Tetha, float* V, float* delta, float* baseV,  int nbus, int lnsz, float** LORanking, int ir);
void YbusLineRemoveEdit(cmplx** Ytemp, cmplx element, int frm_bus, int to_bus, float** Ymag, float** tetha);
void YbusLineAddEdit(cmplx** Ytemp, cmplx element, int frm_bus, int to_bus, float** Ymag, float** tetha);

结构创建于Complex_Operations.c:

typedef struct cmplx
{
    float real;
    float imag;
}cmplx;

我是制作 Makefile 的新手,如果有人能告诉我这里到底发生了什么,那真的很有帮助。谢谢!

您提到 cmplx 类型是在 Complex_Operations.c 中定义的。如果您希望该类型在编译其他文件时可用(如 YBus_Calc.c),则需要在其中包含的文件中声明该类型。

我怀疑将类型声明从 Complex_Operations.c 移动到 Complex_operations.h 将解决您的直接问题。

所有这些确实提出了一个问题,即为什么设计者选择将类型设为 .c 文件的本地类型。通常这样做是因为该类型仅供模块内部使用,而不是已发布 API 的一部分。您是否正在调用一个不希望从另一个模块调用的函数?你同意这个决定吗?