このコードは未定義の動作を引き起こしますか?
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