#ifdef __cplusplus extern c #endif - На что влияет extern "C" в C++?

extern c arduino / c++ / c / linkage / name-mangling / extern-c

Что именно делает добавление extern "C" в код C ++?

Например:

extern "C" {
   void foo();
}

Ciro Santilli TRUMP BAN IS BAD



Answer #1
void f() {}
void g();

extern "C" {
    void ef() {}
    void eg();
}

/ * Предотвратить оптимизацию g и eg. * /
void h() { g(); eg(); }

Скомпилируйте и дизассемблируйте сгенерированный вывод ELF :

g++ -c -std=c++11 -Wall -Wextra -pedantic -o main.o main.cpp
readelf -s main.o

Вывод содержит:

     8: 0000000000000000     7 FUNC    GLOBAL DEFAULT    1 _Z1fv
     9: 0000000000000007     7 FUNC    GLOBAL DEFAULT    1 ef
    10: 000000000000000e    17 FUNC    GLOBAL DEFAULT    1 _Z1hv
    11: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _GLOBAL_OFFSET_TABLE_
    12: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z1gv
    13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND eg

другие символы были искажены.Давайте разберем их:

$ c++filt _Z1fv
f()
$ c++filt _Z1hv
h()
$ c++filt _Z1gv
g()
extern "C" {
    // Перегрузка.
    // ошибка: объявление функции C 'void f (int)' конфликтует с
    void f();
    void f(int i);

    // Шаблоны.
    // ошибка: шаблон со ссылкой на C
    template <class C> void f(C i) { }
}
#include <cassert>

#include "c.h"

int main() {
    assert(f() == 1);
}
#ifndef C_H
#define C_H

/ * Этот ifdef позволяет использовать заголовок как из C, так и из C ++ *, потому что C не знает, что это за внешний "C". * /
#ifdef __cplusplus
extern "C" {
#endif
int f();
#ifdef __cplusplus
}
#endif

#endif
#include "c.h"

int f(void) { return 1; }
g++ -c -o main.o -std=c++98 main.cpp
gcc -c -o c.o -std=c89 c.c
g++ -o main.out main.o c.o
./main.out
main.cpp:6: undefined reference to `f()'
#include <assert.h>

#include "cpp.h"

int main(void) {
    assert(f_int(1) == 2);
    assert(f_float(1.0) == 3);
    return 0;
}
#ifndef CPP_H
#define CPP_H

#ifdef __cplusplus
// C не может видеть эти перегруженные прототипы, иначе он запутается.
int f(int i);
int f(float i);
extern "C" {
#endif
int f_int(int i);
int f_float(float i);
#ifdef __cplusplus
}
#endif

#endif
#include "cpp.h"

int f(int i) {
    return i + 1;
}

int f(float i) {
    return i + 2;
}

int f_int(int i) {
    return f(i);
}

int f_float(float i) {
    return f(i);
}
gcc -c -o main.o -std=c89 -Wextra main.c
g++ -c -o cpp.o -std=c++98 cpp.cpp
g++ -o main.out main.o cpp.o
./main.out
main.c:6: undefined reference to `f_int'
main.c:7: undefined reference to `f_float'