gpt4 book ai didi

C静态函数混淆

转载 作者:太空宇宙 更新时间:2023-11-04 05:46:12 25 4
gpt4 key购买 nike

我试图使 s_cord_print 函数仅在 cord_s.c 文件中可见。目前该函数在 ma​​in.c 中可见/可运行,即使它被声明为静态。

如何使 s_cord_print 函数对 cord_s.c 私有(private)?

谢谢!

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

ma​​in.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;
}

~

最佳答案

问题是:

#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.cs_cord.c 中。您还需要 s_cord_defaultextern 声明。所以完整的代码是:

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;

主.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 调用 s_cord_print(),您现在将收到错误消息。

编辑:我忘记移动 $(EL) 定义,它需要一个用于 VOID_THIS 的外部。

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

gcc s_cord.c main.c -o main

关于C静态函数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com