C静态功能混乱

时间:2011-01-02 04:18:35

标签: c

我正在尝试仅在 cord_s.c 文件中显示 s_cord_print 功能。目前,该功能在 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 个答案:

答案 0 :(得分:6)

问题是:

#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"
<{1}}和main.c中的

。您还需要s_cord.c extern声明。所以完整的代码是:

s_cord.c:

s_cord_default

s_cord.h:

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

main.c中:

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调用#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)的外部。

编辑2:正确的编译命令是:

VOID_THIS

答案 1 :(得分:0)

当您在main.c中包含s_cord.c时,编译器会将您的程序视为一个大文件。它不会将包含的文件视为单独的。要使它们分开,您必须单独编译它们。一旦你单独编译它们,你就必须链接它们来创建整个程序。

当您尝试编译每个部分时,您将收到错误,因为每个文件都不知道另一个文件中的代码。请记住,这是您尝试使用该功能完成的任务。好吧,现在你已经得到了你要求的东西了很多次。现在,您必须创建解释“缺少部分”的头文件。通常,正在编译的文件会查看彼此的“.h”文件(它们#include它们),以便对“缺失”(实际上是外部)部分产生影响。这些是声明,它告诉编译器“假装你已经知道了这一点,并且我保证当我们链接所有内容时,它将被提供”。