C Статическая функция путаницы - PullRequest
0 голосов
/ 02 января 2011

Я пытаюсь сделать функцию s_cord_print видимой только в файле cord_s.c . В настоящее время функция является видимой / запускаемой в main.c , даже если она объявлена ​​статической.

Как сделать функцию s_cord_print приватной для cord_s.c ?

Спасибо!

s_cord.c

typedef struct s_cord{
  int x;
  int y;
  struct s_cord (*print)();
} s_cord;

void* VOID_THIS;
#define $(EL) VOID_THIS=⪙EL

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};

main.c

#include <stdio.h>
#include <stdlib.h>

#include "s_cord.c"

int main(){
  s_cord mycord = s_cord_default;
  mycord.x = 2;
  mycord.y = 3;
  $(mycord).print().print();
  //static didn't seem to hide the function
  s_cord_print();
  return 0;
}

~

Ответы [ 2 ]

6 голосов
/ 02 января 2011

Проблема:

#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
0 голосов
/ 08 февраля 2011

Когда вы включаете s_cord.c из main.c, компилятор видит вашу программу как один большой файл.Он не рассматривает включенный файл как отдельный.Чтобы разделить их, вы должны скомпилировать их отдельно.После того, как вы скомпилировали их по отдельности, вам нужно будет связать их, чтобы создать всю программу.

Когда вы попытаетесь скомпилировать каждую часть, вы получите ошибки, потому что каждый файл не 'не знаю о коде в другом файле.Помните, это то, что вы пытались выполнить с помощью этой единственной функции.Ну, теперь у вас есть то, что вы просили, много раз.Теперь вам нужно создать заголовочные файлы, которые объясняют «недостающие части».Обычно скомпилированные файлы просматривают файлы ".h" друг друга (они #include их), чтобы определить "недостающие" (на самом деле, внешние ) части.Это объявления, которые сообщают компилятору «притвориться, что вы уже знаете об этом, и я обещаю, что когда мы все свяжем, это будет предоставлено».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...