8

このコードは未定義の動作を引き起こしますか?

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

4

1 に答える 1