Проблема:
#include "s_cord.c"
Вы должны удалить это.Вместо этого создайте файл s_cord.h
, который содержит только объявления, такие как:
typedef struct s_cord{
int x;
int y;
struct s_cord (*print)();
} s_cord;
и поместите:
#include "s_cord.h"
в main.c
и s_cord.c
.Вам также нужно объявление extern
для s_cord_default
.Итак, полный код:
s_cord.c:
#include "s_cord.h"
#include <stdio.h>
void* VOID_THIS;
static s_cord s_cord_print(){
struct s_cord *THIS;
THIS = VOID_THIS;
printf("(%d,%d)\n",THIS->x,THIS->y);
return *THIS;
}
const s_cord s_cord_default = {1,2,s_cord_print};
s_cord.h:
typedef struct s_cord{
int x;
int y;
struct s_cord (*print)();
} s_cord;
#define $(EL) VOID_THIS=&EL;EL
extern const s_cord s_cord_default;
extern void *VOID_THIS;
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "s_cord.h"
int main(){
s_cord mycord = s_cord_default;
mycord.x = 2;
mycord.y = 3;
$(mycord).print().print();
return 0;
}
Теперь вы получите сообщение об ошибке, если попытаетесь вызвать s_cord_print()
с основного, как и ожидалось.
РЕДАКТИРОВАТЬ: я забыл переместить определение $(EL)
, и для VOID_THIS
требовался extern.
РЕДАКТИРОВАТЬ 2: Правильная команда компиляции:
gcc s_cord.c main.c -o main