C 静态函数混淆

C 静态函数混淆,c,C,我试图使s\u cord\u print功能仅在cord\u.c文件中可见。当前,该函数在main.c中可见/可运行,即使它被声明为静态 如何使s\u cord\u print功能专用于cord\u.c 谢谢 s_线.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\u cord\u print功能仅在cord\u.c文件中可见。当前,该函数在main.c中可见/可运行,即使它被声明为静态

如何使s\u cord\u print功能专用于cord\u.c

谢谢

s_线.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};
#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;
}
main.c

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

void* VOID_THIS;
#define $(EL) VOID_THIS=&EL;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};
#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;
}
#包括
#包括
#包括“s_cord.c”
int main(){
s_cord mycord=s_cord_默认值;
mycord.x=2;
mycord.y=3;
$(mycord.print().print();
//static似乎没有隐藏函数
s_线_打印();
返回0;
}
~

问题是:

#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\u cord.c
中。您还需要
s\u cord\u default
extern
声明。因此,完整的代码是:

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};
主要条款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;
}
问题是:

#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\u cord.c
中。您还需要
s\u cord\u default
extern
声明。因此,完整的代码是:

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};
主要条款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;
}

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


当您试图编译每个部分时,您将得到错误,因为每个文件都不知道另一个文件中的代码。请记住,这是您试图通过这一功能实现的。好吧,现在你已经得到了你想要的,很多次了。现在,您必须创建头文件来解释“缺少的部分”。通常,正在编译的文件会查看彼此的“.h”文件(包括它们),以了解“缺少的”(实际上是外部)部分。这些声明告诉编译器“假设你已经知道了这一点,我保证当我们链接所有东西时,它都会被提供。”

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


当您试图编译每个部分时,您将得到错误,因为每个文件都不知道另一个文件中的代码。请记住,这是您试图通过这一功能实现的。好吧,现在你已经得到了你想要的,很多次了。现在,您必须创建头文件来解释“缺少的部分”。通常,正在编译的文件会查看彼此的“.h”文件(包括它们),以了解“缺少的”(实际上是外部)部分。这些是声明,它们告诉编译器“假设您已经知道这一点,我保证当我们链接所有内容时,都会提供它”。

标题(和实现)还需要对
s_coord
结构执行某种初始化例程。我尝试进行编辑,但遇到以下错误:对's_cord_print'的引用未定义,它来自$(mycord).print()行而不是s_cord_print()行。@Nikolai,你是说
s\u cord\u default
?当我开始得到这个错误以及VOID\u这个VOID指针时,我把s\u cord\u default移到了s\u cord.h。我真的不知道该做什么。通过包含s_cord.h,s_cord.c应该如何包含在main.c中?谢谢我建议您不要麻烦使用全局
VOID\u这个
。将对象指针作为参数传递给每个方法。当人们在C中使用OO时,这就是它的典型工作方式。宏黑客只是让它看起来很邪恶。(更不用说编写时它不是线程安全的,还有其他问题。)头(和实现)还需要某种类型的初始化例程,用于
s_-coord
结构。我尝试进行编辑,但遇到以下错误:未定义对's_-cord_-print'的引用,它来自$(mycord).print()行不是s_cord_print()行。@Nikolai,你的意思是
s_cord_default
?当我开始得到这个错误以及这个无效指针时,我把s_cord_default移到了s_cord.h。我真的不知道该做什么。通过包含s_cord.h,s_cord.c应该如何包含在main.c中?谢谢我建议您不要麻烦使用全局
VOID\u这个
。将对象指针作为参数传递给每个方法。当人们在C中使用OO时,这就是它的典型工作方式。宏黑客只是让它看起来很邪恶。(更不用说编写时它不是线程安全的,还有其他问题。)看起来您正试图用
VOID\u THIS
global和
$(EL)
宏在C中进行一些基本的面向对象编程。你做错了。此外,尽管许多编译器接受
$
作为有效的标识符字符,但根据C标准,它是无效的。看起来您正试图用
VOID\u THIS
全局和
$(EL)
宏在C中进行一些基本的面向对象编程。你做错了。此外,尽管许多编译器接受
$
作为有效的标识符字符,但根据C标准,它是无效的。