这段代码会导致未定义行为吗?
header.h
#ifdef __cplusplus
extern "C"
{
#endif
inline int foo(int a)
{
return a * 2;
}
#ifdef __cplusplus
}
#endif
def.c
#include "header.h"
extern inline int foo(int a);
use.c
#include "header.h"
int bar(int a)
{
return foo(a + 3);
}
main.cpp
#include <stdio.h>
#include "header.h"
extern "C"
{
int bar(int a);
}
int main(int argc, char** argv)
{
printf("%d\n", foo(argc));
printf("%d\n", bar(argc));
}
这是一个示例程序,在C和C++中都需要使用inline
函数。如果在C中删除def.c
并且不使用foo
,它会起作用吗? (假设C编译器是C99)
该代码可在以下编译器上编译成功:
gcc -std=c99 -pedantic -Wall -Wextra -c -o def.o def.c
g++ -std=c++11 -pedantic -Wall -Wextra -c -o main.o main.cpp
gcc -std=c99 -pedantic -Wall -Wextra -c -o use.o use.c
g++ -std=c++11 -pedantic -Wall -Wextra -o extern_C_inline def.o main.o use.o
foo
只在 extern_C_inline
中出现一次,因为编译器在不同的目标文件中输出的不同版本会被合并,但我想知道这种行为是否由标准指定。如果我删除 foo
的 extern
定义,并将其定义为 static
,那么 foo
将在每个编译单元中都出现在 extern_C_inline
中多次。
foo()
中有一个静态局部变量,则将foo
设置为静态意味着您在每个翻译单元中都会得到一个不同的静态局部变量,而不是整个程序的单个静态局部变量)。只有在有意义的情况下使用static
,而不仅仅是为了解决链接器错误。 - Jonathan Wakely