【问题标题】:separate compilation in C gives error if function is declared in header file如果在头文件中声明函数,则 C 中的单独编译会出错
【发布时间】:2012-11-21 02:56:43
【问题描述】:

我在使用 gcc 编译 C 中的单独模块时遇到问题:

基本上,我有我的标题,common.h:

#ifndef COMMON_M
    #include<stdio.h>
    #define COMMON_M
    void print_array(int *a,int n);
    void swap(int *v,int i,int j);
#endif

我的functions.c上面的函数实现:

#include "common.h"
void print_array(int *a,int n) {
    int i=0;
    for(;i<n;++i)
        printf( (i==n-1) ? "%d\n" : "%d ", a[i]);
}
void swap(int *v,int i,int j) {
    int t=v[i];
    v[i]=v[j];
    v[j]=t;
}

和我的主要:

#include "common.h"
void main() {
    int a[10]={6,2,0,12,4,3,7,-4,12,7};
    print_array(a,10);
    qsort_c(a,0,10);
    print_array(a,10);
}

如果我尝试将 funcionts.c 编译为模块 ( gcc -c functions.c ) 我会收到此错误:

错误:重新定义“交换” 错误:“print_array”的重新定义

有人能帮我理解为什么吗? 我在 common.h 中声明一个函数并在 functions.c 中定义它!我不明白为什么这在理论上不起作用。

提前致谢,

【问题讨论】:

  • 这些是您要编译的确切文件吗?使用 GCC 4.2 对我来说效果很好(我刚刚尝试过)
  • 您显示的来源不会出现此错误。必须有一些不同的东西,无论是源代码还是编译或链接步骤。
  • @Vyktor: -c 告诉 GCC 链接。
  • @netcoder 不知何故我觉得他在混淆编译和链接
  • 尝试从标题中的函数声明中删除变量名,并将extern 添加到声明中。

标签: c module compilation linkage


【解决方案1】:

从上面的代码中,我看到的是:你包含了common.h 两次。一个在myfunction.c 中,另一个在你的文件中,你有main()。

【讨论】:

  • 这不应该是一个问题,而且事实上可能是最好的,只要 main.cmyfunction.c 分别编译。如果main.c #includes myfunction.c 这显然是不同的,但这里似乎并非如此(尽管这将是包含警卫的原因......)。
  • @twalberg。由于代码在许多 SO 用户的编译器和我的编译器上都运行良好,我只是猜测 main.c #includes myfunction.c 是否。那么这可能是一个原因。如果只有用户可以详细说明
猜你喜欢
  • 2020-06-06
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2014-04-11
相关资源
最近更新 更多