这个C代码有什么问题?奇怪的错误

这个C代码有什么问题?奇怪的错误,c,C,我第一次尝试写C,我不断地得到以下错误。当我注释掉函数和常量时,它将被编译。我不能像在C++中那样声明标题文件中的常量和内联函数吗? #include <stdlib.h> typedef unsigned long base_int; typedef unsigned long long overflow_int; typedef base_int * big_int; const unsigned int INIT_LENGTH = 3; inline int bi_sign

我第一次尝试写C,我不断地得到以下错误。当我注释掉函数和常量时,它将被编译。我不能像在C++中那样声明标题文件中的常量和内联函数吗?
#include <stdlib.h>

typedef unsigned long base_int;
typedef unsigned long long overflow_int;
typedef base_int * big_int;
const unsigned int INIT_LENGTH = 3;

inline int bi_sign(big_int x)
{
    return 2;
}
void bi_create(int);
void bi_dealloc(big_int *);
//End of bigint.h

"/C/CPP Dev/msys/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make.exe[1]: Entering directory `/c/Users/Chase/Documents/NetBeansProjects/CBigNum'
"/C/CPP Dev/msys/bin/make.exe"  -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/cbignum.exe
make.exe[2]: Entering directory `/c/Users/Chase/Documents/NetBeansProjects/CBigNum'
mkdir -p build/Debug/MinGW-Windows
rm -f "build/Debug/MinGW-Windows/big_int.o.d"
gcc    -c -g -MMD -MP -MF "build/Debug/MinGW-Windows/big_int.o.d" -o build/Debug/MinGW-Windows/big_int.o big_int.c
mkdir -p build/Debug/MinGW-Windows
rm -f "build/Debug/MinGW-Windows/main.o.d"
gcc    -c -g -MMD -MP -MF "build/Debug/MinGW-Windows/main.o.d" -o build/Debug/MinGW-Windows/main.o main.c
mkdir -p dist/Debug/MinGW-Windows
gcc     -o dist/Debug/MinGW-Windows/cbignum build/Debug/MinGW-Windows/big_int.o build/Debug/MinGW-Windows/main.o 
build/Debug/MinGW-Windows/main.o: In function `bi_sign':
C:\Users\Chase\Documents\NetBeansProjects\CBigNum/bigint.h:9: multiple definition of `bi_sign'
build/Debug/MinGW-Windows/big_int.o:C:\Users\Chase\Documents\NetBeansProjects\CBigNum/bigint.h:9: first defined here
collect2.exe: error: ld returned 1 exit status
make.exe[2]: *** [dist/Debug/MinGW-Windows/cbignum.exe] Error 1
make.exe[2]: Leaving directory `/c/Users/Chase/Documents/NetBeansProjects/CBigNum'
make.exe[1]: *** [.build-conf] Error 2
make.exe[1]: Leaving directory `/c/Users/Chase/Documents/NetBeansProjects/CBigNum'
make.exe": *** [.build-impl] Error 2
#包括
typedef无符号长基整数;
typedef无符号长溢出\u int;
typedef base_int*big_int;
const unsigned int INIT_LENGTH=3;
内联整数双符号(大整数x)
{
返回2;
}
void bi_create(int);
void bi_dealloc(big_int*);
//bigint.h的结尾
“/C/CPP Dev/msys/bin/make.exe”-f nbproject/Makefile-Debug.mk QMAKE=SUBPROJECTS=.build conf
make.exe[1]:输入目录“/c/Users/Chase/Documents/NetBeansProjects/CBigNum”
“/C/CPP Dev/msys/bin/make.exe”-f nbproject/Makefile-Debug.mk dist/Debug/MinGW Windows/cbignum.exe
make.exe[2]:输入目录“/c/Users/Chase/Documents/NetBeansProjects/CBigNum”
mkdir-p生成/调试/明gw窗口
rm-f“构建/调试/MinGW Windows/big_int.o.d”
gcc-c-g-MMD-MP-MF“build/Debug/MinGW Windows/big_int.o.d”-o build/Debug/MinGW Windows/big_int.o big_int.c
mkdir-p生成/调试/明gw窗口
rm-f“build/Debug/MinGW Windows/main.o.d”
gcc-c-g-MMD-MP-MF“build/Debug/mingwwindows/main.o.d”-o build/Debug/mingwwindows/main.o main.c
mkdir-p dist/Debug/MinGW窗口
gcc-o dist/Debug/MinGW-Windows/cbignum-build/Debug/MinGW-Windows/big_-int.o build/Debug/MinGW-Windows/main.o
build/Debug/MinGW Windows/main.o:在函数'bi_sign'中:
C:\Users\Chase\Documents\NetBeansProjects\CBigNum/bigint.h:9:biu符号的多重定义
build/Debug/MinGW Windows/big_int.o:C:\Users\Chase\Documents\NetBeansProjects\CBigNum/bigint.h:9:首先在此处定义
collect2.exe:错误:ld返回了1个退出状态
make.exe[2]:***[dist/Debug/MinGW-Windows/cbignum.exe]错误1
make.exe[2]:离开目录“/c/Users/Chase/Documents/NetBeansProjects/CBigNum”
make.exe[1]:***[.build conf]错误2
make.exe[1]:离开目录“/c/Users/Chase/Documents/NetBeansProjects/CBigNum”
make.exe:***[.build impl]错误2
这是我更新的头文件(我又添加了一些函数) 我还有其他文件,main.c和bigint.c,它们都包括bitint.h。 只有在我注释掉bigint.cpp文件中的#include“bigint.h”时,代码才会编译。该文件中没有其他内容。错误与以前相同

#ifndef BIGINT_H
#define BIGINT_H
#include <stdlib.h>

typedef unsigned long base_int;
typedef unsigned long long overflow_int;
typedef base_int * big_int;
const unsigned int INIT_LENGTH = 3;

//Memory
int bi_sign(const big_int x);
unsigned int bi_length(const big_int x);
unsigned int bi_mem_size(const big_int x);
void bi_init(big_int * x, int n);
big_int bi_create(int x);
void bi_dealloc(big_int* x);
void bi_copy(const big_int, big_int*);

//Arithmetic
big_int bi_add(const big_int, const big_int);
big_int bi_add_int(const big_int, int);
big_int bi_mult(const big_int, const big_int);
big_int bi_mult_int(const big_int, int);
big_int bi_sub(const big_int, const big_int);
big_int bi_sub_int(const big_int, int);
void bi_incby(big_int*, unsigned int);
void bi_decby(big_int*, unsigned int);
void bi_multby(big_int*, unsigned int);
#endif
\ifndef BIGINT\u H
#定义BIGINT_H
#包括
typedef无符号长基整数;
typedef无符号长溢出\u int;
typedef base_int*big_int;
const unsigned int INIT_LENGTH=3;
//记忆
整数双符号(常数大整数x);
无符号整数bi_长度(常量big_int x);
无符号整数biu_mem_size(常量big_int x);
void bi_init(大整数*x,整数n);
大整数比创建(整数x);
void bi_dealoc(big_int*x);
无效BIU副本(常量big_int,big_int*);
//算术
大整数比整数加(常数大整数,常数大整数);
大整数比整数加整数(常数大整数,整数);
大整数比整数(常数大整数,常数大整数);
大整数比整数(常数大整数,整数);
大整数BIU sub(常数大整数,常数大整数);
大整数比小整数(常数大整数,整数);
void bi_incby(大整数*,无符号整数);
void bi_decby(大整数*,无符号整数);
无效双整数(大整数*,无符号整数);
#恩迪夫
另外,我刚刚注意到,如果我从main.c中删除include并只将其保留在bigint.cpp中,它仍然可以编译。出于某种原因,我看起来只能包含一次。

关键行是

C:\Users\Chase\Documents\NetBeansProjects\CBigNum/bigint.h:9: multiple definition of `bi_sign'
您肯定在多个
.c
文件中包含了
bigint.h
。由于预处理器通过文本替换工作,这与在每个包含的文件中声明相同的函数相同。因此,链接器会看到相同函数名的多个定义并终止

正如@Wumpus指出的,您可以通过声明函数
static inline
来解决这个问题。
static
声明器使函数在出现的
.c
本地(无论是通过
include
还是直接)。它的符号不向链接器公开


请注意,同一函数的
内联
和多个
静态
声明都可能导致代码膨胀。正如您所做的那样,它们应该仅用于小函数。

您可能需要
静态内联
。相关问题: