Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中头文件中的内联函数_C_Inline - Fatal编程技术网

C中头文件中的内联函数

C中头文件中的内联函数,c,inline,C,Inline,我试图在网上搜索一个好的答案,但没有找到一个我能完全理解的答案。假设我有一个标题“add.h”: 名为“adddouble.c”的文件: 名为“addsquare.c”的文件: 主文件“main.c”: #包括 int adddouble(int,int); int addsquare(int,int); int main(){ printf(“adddouble=%d\n”,adddouble(10,20)); printf(“addsquare=%d\n”,addsquare(10,20))

我试图在网上搜索一个好的答案,但没有找到一个我能完全理解的答案。假设我有一个标题“add.h”:

名为“adddouble.c”的文件:

名为“addsquare.c”的文件:

主文件“main.c”:

#包括
int adddouble(int,int);
int addsquare(int,int);
int main(){
printf(“adddouble=%d\n”,adddouble(10,20));
printf(“addsquare=%d\n”,addsquare(10,20));
返回0;
}
我使用gcc5.2.0编译这些文件,但得到:“架构x86_64的未定义符号:”。如果我在add.h或 将声明“extern int add(int,int);”添加到“adddouble.c”,它编译 成功无误。我是内联函数的新手,我不知道如何解释和理解这种行为。谢谢

根据 , 看起来,内联函数在C和C++中的行为有所不同:

任何具有内部链接的函数都可以是内联函数。暂时 与外部联动装置一起运行时,以下限制适用:如果 函数是用内联函数说明符声明的,然后 也可以在同一翻译单位中定义。如果所有的文件范围 翻译单元中函数的声明包括内联 没有外部的函数说明符,那么 翻译单元是一个内联定义。内联定义不起作用 不提供函数的外部定义,并且 禁止在其他翻译单元中使用外部定义。内联 定义提供了外部定义的替代方法,外部定义 翻译器可以使用来实现对同一语言中函数的任何调用 翻译股。未指定是否调用该函数 使用内联定义或外部定义。140)

如果不将
static
放在那里,则定义带有外部链接的内联函数,而不实例化外部定义

extern-int-add(int,int)
为该函数恢复外部定义,您需要准确地执行一次(无论在哪个文件中),链接才能成功(或者您可以标记内联函数
static
,问题就会消失)


<>(在C++中,<代码>内联< /COD>在每个翻译单元中创建弱的外部定义,这样您就不必担心标记为“代码>静态< /代码>或实例化一个内联函数的外部定义——G+应该直接用.C*>在F中编译它,做g++-c“$F”;完成;g++*.o没有任何问题。)

您的构建选项是什么?除非您在C99或C11中构建,否则C中没有内联函数的概念。您必须与其他C文件一起编译头文件,或者同时提供.h和.C、add.h作为原型,add.C作为代码+1好问题。实际上,它与g++的链接很好,但我无法让它与gcc(-std=c11)一起工作。这些add符号在addsquare.o和adddouble.c中都是未定义的(U)。相反,g++为add函数创建弱符号(W),这就是它链接的原因。如果-std=c99,它仍然不起作用。请参见以下内容:。您必须为
add()
提供外部定义。
inline int add(int a, int b){ return a+b; }
#include "add.h"

int adddouble(int a, int b){ return 2*add(a,b); }
#include "add.h"

int addsquare(int a, int b){ return add(a,b)*add(a,b); }
#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;
}