【发布时间】:2016-03-12 10:04:27
【问题描述】:
我试图在网上搜索一个好的答案,但没有找到一个我能完全理解的答案。假设我有一个标题“add.h”:
inline int add(int a, int b){ return a+b; }
一个名为“adddouble.c”的文件:
#include "add.h"
int adddouble(int a, int b){ return 2*add(a,b); }
一个名为“addsquare.c”的文件:
#include "add.h"
int addsquare(int a, int b){ return add(a,b)*add(a,b); }
一个主文件“main.c”:
#include<stdio.h>
int adddouble(int, int);
int addsquare(int, int);
int main(){
printf("add double = %d\n", adddouble(10,20));
printf("add square = %d\n", addsquare(10,20));
return 0;
}
我使用 gcc5.2.0 编译这些文件,但得到:“架构 x86_64 的未定义符号:”。如果我将静态添加到 add.h 中的内联函数或 添加声明“extern int add(int, int);”到“adddouble.c”,它编译 成功没有错误。我是内联函数的新手,我不知道如何解释和理解这种行为。谢谢
【问题讨论】:
-
您有哪些构建选项?除非您在 C99 或 C11 中构建,否则 C 中没有内联函数的概念。
-
头文件必须和其他c文件一起编译或者同时提供.h和.c,add的原型为add.h,代码为add.c
-
+1 好问题。它实际上与 g++ 链接得很好,但我无法让它与 gcc (-std=c11) 一起使用。这些添加符号在 addsquare.o 和 adddouble.c 中都是未定义的 (U)。 g++ 反而为 add 函数创建了弱符号 (W),这就是它链接的原因。
-
加上-std=c99,还是不行。
-
见这个:C99 inline function in .c file。您必须为
add()提供外部定义。