在多个C源文件中具有相同功能

4
我在寻找为什么我不能在多个C源文件中拥有相同函数的问题上遇到了困难。我一直以为只要它们没有在头文件中声明,我就无法访问另一个源文件中的函数。
假设我有以下文件:
main.c -> 包含 thread1.h 和 thread2.h
thread1.h -> 声明例如void * thread1()
thread1.c -> 定义void * thread1() {},并定义void lock() {}
thread2.h -> 声明例如void * thread2()
thread2.c -> 定义void * thread2() {},并定义void lock() {}
现在gcc告诉我我不能做到这点!
gcc -pthread -Wall -o executable main.c thread1.c thread2.c
错误:对“lock”的多重定义
我的问题是:如何完成我想要的操作?我认为这不可能。否则,所有可用于众多C库中的C源代码都需要是唯一的(不会有任何意义,不是吗?)。所以我想了3小时,肯定有解决办法,我可能正在忽略某些东西。我试图谷歌搜索它...但不知道为什么这次我的谷歌技能没有帮助我。真的没有办法做到这一点吗? 还是我只是太愚蠢了,无法搜索到答案?
谢谢! leep
2个回答

8

你需要将函数lock()设为静态

static void lock() {..}

原因是具有 static 的功能在“翻译单元”之外不可见。 换句话说,静态函数对于*.c文件来说是私有的。 因此,在链接阶段,它们不会导致链接错误,就像您目前遇到的问题一样。

1
补充一下,static 意味着函数不被 _导出_。它在源文件之外没有名称,因此不会发生冲突。 - Guido
谢谢,你今天是我的英雄:D太完美了!不知道为什么谷歌没有找到那个... - leep ev8dance
如果我从一个被导出的函数中调用那个静态锁,这仍然有效吗?(例如,在我的问题示例中,thread1(){ lock(); })或者会引起其他问题吗? - leep ev8dance
static 意味着它对于任何其他的 *.c 文件都不可见。但是在 thread1.c 中仍然可见,您可以调用它。因此它不会引起任何问题。 - UltraInstinct

0

你必须将lock声明为static void lock(){}

否则,函数名称将在整个程序中可见,并且会出现名称冲突(尽管您仍然无法在没有函数原型的情况下调用它)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接