鱼C论坛

 找回密码
 立即注册
查看: 2077|回复: 6

[已解决]c 语言问题

[复制链接]
发表于 2021-9-16 23:47:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
c 里面有没有像 python 那种 import numpy as np
然后 np.func() 使用对应函数的东西

之所以要这种的,是因为我有一个 main.c, 然后里面 include 了三个.c 文件 (A.c B.c C.c)

然后这三个里面,均 include 另一个 .c 文件 (D.c),共用里面的function

那么问题来了,在 main.c 里面,相当于同时 include 了三遍 D.c,有没有办法解决?

我知道最沙雕的办法就是把 D.c 里面的放进 A B C 里,但是这样依然会重复定义 function 吧?
最佳答案
2021-9-17 02:49:41
你不应该 include .c 文件,虽然这不会有语法错误
#include <a.c>
这么写,语法上确实没问题,也确实有一些程序库使用 include .c 文件的方法完成一些特殊任务
通常是下面这样
#define name x_name
#include <name.c>
#undef name

这样会把 name.c 文件中的所有 name 改成 x_name,然后 include 到当前 .c 文件
在另一个 .c 文件中会这样
#define name y_name
#include <name.c>
#undef name

另一个
#define name z_name
#include <name.c>
#undef name

这样的代码在一些库中确实存在,但是不多见,真的不多,至少我见过的这样的用法真的不多


回到你的问题,不建议 include .c 文件
你可以创建 .h 文件,把其他文件中要调用的函数,在 .h 文件中声明一下,.c 文件中定义
别的地方要使用的时候,就 include .h 文件
像下面这样

main.c
#include "a.h"
#include "b.h"
#include "c.h"
#include "d.h"
#include <stdio.h>

int main(void) {
    printf("ay: %d\n", ay(0));
    printf("az: %s\n", az(1) ? "true" : "false");
    printf("by: %s\n", by(2) ? "true" : "false");
    printf("cz: %d\n", cz(0));
    printf("dc: %c\n", dc(3));
    printf("dd: %lf\n", dd(4));
    return 0;
}

a.h
#ifndef _A_H_
#define _A_H_

#include <stdbool.h>

int ay(int n);
bool az(int n);

#endif

a.c
#include "a.h"
#include "d.h"
#include <stdio.h>

// static 函数留着自己用,不导出,外部不能用
// 总会有一些函数是不希望外部调用的
static const char *ax(size_t index) {
    static char *string[] = {
        "0123",
        "abcd",
        "xxxx",
        "    "
    };
    return string[index];
}

int ay(int n) {
    printf("%d\n", 1 + db(n));
    return -n;
}

bool az(int n) {
    printf("%s\n", ax(n));
    return n == dc(n + 1);
}

b.h
#ifndef _B_H_
#define _B_H_

#include <stdbool.h>

bool by(int n);

#endif

b.c
#include "b.h"
#include "d.h"
#include <stdio.h>

static int bx(int index) {
    return 100 + index - da();
}

static int bx_n(size_t index) {
    return 101 + index + dc(index);
}

bool by(int n) {
    printf("%d: %lf\n", bx(1) + bx_n(1), dd(n));
    return n == bx(1);
}

c.h
#ifndef _C_H_
#define _C_H_

int cz(int n);

#endif

c.c
#include "c.h"
#include "d.h"
#include <stddef.h>

static int cc(int index) {
    return index + dc(index);
}

static int cn(size_t index) {
    return index + '0' + da();
}

int cz(int n) {
    return cc(n) + cn(n) - db(n);
}

d.h
#ifndef _D_H_
#define _D_H_

int da(void);
int db(int n);
char dc(char ch);
double dd(double x);

#endif

d.c
#include "d.h"

int da(void) {
    return 1;
}

int db(int n) {
    return ' ' + n;
}

char dc(char ch) {
    return ch + '0';
}

double dd(double x) {
    return x * x;
}

编译命令
gcc -g -Wall -o main main.c a.c b.c c.c d.c

运行,(输出没有任何意义,^_^)
$ ./main
33
ay: 0
abcd
az: false
251: 4.000000
by: false
cz: 65
dc: 3
dd: 16.000000
$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-17 00:42:44 From FishC Mobile | 显示全部楼层
C语言作业在哪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-17 02:49:41 | 显示全部楼层    本楼为最佳答案   
你不应该 include .c 文件,虽然这不会有语法错误
#include <a.c>
这么写,语法上确实没问题,也确实有一些程序库使用 include .c 文件的方法完成一些特殊任务
通常是下面这样
#define name x_name
#include <name.c>
#undef name

这样会把 name.c 文件中的所有 name 改成 x_name,然后 include 到当前 .c 文件
在另一个 .c 文件中会这样
#define name y_name
#include <name.c>
#undef name

另一个
#define name z_name
#include <name.c>
#undef name

这样的代码在一些库中确实存在,但是不多见,真的不多,至少我见过的这样的用法真的不多


回到你的问题,不建议 include .c 文件
你可以创建 .h 文件,把其他文件中要调用的函数,在 .h 文件中声明一下,.c 文件中定义
别的地方要使用的时候,就 include .h 文件
像下面这样

main.c
#include "a.h"
#include "b.h"
#include "c.h"
#include "d.h"
#include <stdio.h>

int main(void) {
    printf("ay: %d\n", ay(0));
    printf("az: %s\n", az(1) ? "true" : "false");
    printf("by: %s\n", by(2) ? "true" : "false");
    printf("cz: %d\n", cz(0));
    printf("dc: %c\n", dc(3));
    printf("dd: %lf\n", dd(4));
    return 0;
}

a.h
#ifndef _A_H_
#define _A_H_

#include <stdbool.h>

int ay(int n);
bool az(int n);

#endif

a.c
#include "a.h"
#include "d.h"
#include <stdio.h>

// static 函数留着自己用,不导出,外部不能用
// 总会有一些函数是不希望外部调用的
static const char *ax(size_t index) {
    static char *string[] = {
        "0123",
        "abcd",
        "xxxx",
        "    "
    };
    return string[index];
}

int ay(int n) {
    printf("%d\n", 1 + db(n));
    return -n;
}

bool az(int n) {
    printf("%s\n", ax(n));
    return n == dc(n + 1);
}

b.h
#ifndef _B_H_
#define _B_H_

#include <stdbool.h>

bool by(int n);

#endif

b.c
#include "b.h"
#include "d.h"
#include <stdio.h>

static int bx(int index) {
    return 100 + index - da();
}

static int bx_n(size_t index) {
    return 101 + index + dc(index);
}

bool by(int n) {
    printf("%d: %lf\n", bx(1) + bx_n(1), dd(n));
    return n == bx(1);
}

c.h
#ifndef _C_H_
#define _C_H_

int cz(int n);

#endif

c.c
#include "c.h"
#include "d.h"
#include <stddef.h>

static int cc(int index) {
    return index + dc(index);
}

static int cn(size_t index) {
    return index + '0' + da();
}

int cz(int n) {
    return cc(n) + cn(n) - db(n);
}

d.h
#ifndef _D_H_
#define _D_H_

int da(void);
int db(int n);
char dc(char ch);
double dd(double x);

#endif

d.c
#include "d.h"

int da(void) {
    return 1;
}

int db(int n) {
    return ' ' + n;
}

char dc(char ch) {
    return ch + '0';
}

double dd(double x) {
    return x * x;
}

编译命令
gcc -g -Wall -o main main.c a.c b.c c.c d.c

运行,(输出没有任何意义,^_^)
$ ./main
33
ay: 0
abcd
az: false
251: 4.000000
by: false
cz: 65
dc: 3
dd: 16.000000
$

评分

参与人数 2荣誉 +6 鱼币 +6 贡献 +3 收起 理由
傻眼貓咪 + 1 + 1 感谢楼主无私奉献!
Daniel_Zhang + 5 + 5 + 3 感激之情无以言表

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-9-17 02:54:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 04:41:14 | 显示全部楼层
人造人 发表于 2021-9-17 02:49
你不应该 include .c 文件,虽然这不会有语法错误

这么写,语法上确实没问题,也确实有一些程序库使用 i ...

谢谢大佬的指点

所以大佬的意思是,比如说我有 ABC 三个.c 文件,这三个文件都需要调用同一个 function,那么我就可以写一个 D.h, 里面写入我的 function 的声明,然后再在 ABC 文件里分别加入 include "D.h". 接下来无论在 ABC 的哪个文件里定义这个 function, 其他两个 .c 文件都能使用我在这个文件里定义的 function 对吧?

就相当于引入了这个声明,就会在编译时,对所有的.c 文件进行寻找,找到这个 function 的定义,提供给每一个需要使用这个 function 的文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-17 09:59:46 | 显示全部楼层
Daniel_Zhang 发表于 2021-9-17 04:41
谢谢大佬的指点

所以大佬的意思是,比如说我有 ABC 三个.c 文件,这三个文件都需要调用同一个 function, ...

其实从 .c 文件生成 可执行文件分好多步骤的
预处理 -> 编译 -> 汇编 -> 链接
每一个 .c 文件都是独立编译的,编译器把 .c 文件编译成对应的 .o 文件,编译阶段(预处理 -> 编译 -> 汇编)
就是生成 .o 文件之前,编译器并不处理引用外部符号的情况,编译器只需要一个声明,再链接阶段,由链接器来处理引用外部符号的情况

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Daniel_Zhang + 5 + 5 + 3 厉害了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-9-17 10:38:45 | 显示全部楼层
人造人 发表于 2021-9-17 09:59
其实从 .c 文件生成 可执行文件分好多步骤的
预处理 -> 编译 -> 汇编 -> 链接
每一个 .c 文件都是独立 ...

okkkkkk,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-6 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表