此代码会导致未定义的行为吗?
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));
}
inline
这是一个必须在 C 和 C++ 中都使用函数的程序示例。如果def.c
被删除并且foo
没有在 C 中使用,它会起作用吗?(这是假设 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
一次,因为编译器在不同目标文件中输出的不同版本被合并,但我想知道这种行为是否由标准指定。如果我删除并使其extern
定义,那么它将多次出现,因为编译器在每个编译单元中输出它。foo
static
foo
extern_C_inline