【发布时间】:2010-04-27 14:58:11
【问题描述】:
我浏览了一些与此主题相关的帖子,但无法完全解决我的疑问。这可能是一个非常幼稚的问题。
我有一个头文件inline.h 和两个翻译单元main.cpp 和tran.cpp。
具体代码如下
内联.h
#ifndef __HEADER__
#include <stdio.h>
extern inline int func1(void)
{ return 5; }
static inline int func2(void)
{ return 6; }
inline int func3(void)
{ return 7; }
#endif
main.c
#define <stdio.h>
#include <inline.h>
int main(int argc, char *argv[])
{
printf("%d\n",func1());
printf("%d\n",func2());
printf("%d\n",func3());
return 0;
}
tran.cpp
//(note that the functions are not inline here)
#include <stdio.h>
int func1(void)
{ return 500; }
int func2(void)
{ return 600; }
int func3(void)
{ return 700; }
上述代码在 g++ 中编译,但在 gcc 中不编译(即使您进行了与 gcc 相关的更改,例如将代码更改为 .c,不使用任何 C++ 头文件等)。显示的错误是“内联函数的重复定义 - func3”。
您能否解释一下为什么编译器会出现这种差异?
另外,当您通过创建两个单独的编译单元(main.o 和tran.o)运行程序(g++ 编译)并创建可执行文件a.out 时,获得的输出为:
500
6
700
为什么编译器会选择非内联函数的定义。实际上,由于 #include 用于“添加”内联定义,因此我期望 5,6,7 作为输出。我的理解是在编译过程中,因为找到了内联定义,所以函数调用将被内联函数定义“替换”。
您能否详细告诉我编译和链接的过程,这将导致我们得到500,6,700 输出。我只能理解输出 6。
【问题讨论】:
-
你不是在“#ifndef HEADER”之后缺少一个“#define HEADER”吗??
-
您将哪些命令行开关传递给 GCC? C99 中
inline的规范与传统的GCC 特定扩展不同。您尝试使用哪种规范? -
1)
#ifndef __HEADER__(预处理器)以一个或多个下划线开头的标识符保留用于语言实现。 2) 哪种语言,C 还是 C++? -
您的示例缺少
#define __HEADER__。另外,这是一个链接(我认为它可能会有所帮助):greenend.org.uk/rjk/tech/inline.html