我正在尝试仅在 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;
}
〜
答案 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它们),以便对“缺失”(实际上是外部)部分产生影响。这些是声明,它告诉编译器“假装你已经知道了这一点,并且我保证当我们链接所有内容时,它将被提供”。