C-эквивалент встроенного C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C-эквивалент встроенного C++

Сообщение Anonymous »

Я работаю над проектом, включающим смешанное программирование на C и C++, в котором с обеих сторон имеется множество очень коротких, но очень часто используемых служебных функций, и я поместил их все в единый заголовочный файл.
/>

Код: Выделить всё

// utils.h
#pragma once
inline int my_common_util_function_1() {
return 42;
}
Я планирую использовать его следующим образом:

Код: Выделить всё

// foo.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
int foo_a();
int foo_b();
#ifdef __cplusplus
}
#endif

// foo_c_impl.c
#include "utils.h"
#include "foo.h"
int foo_a() {
return my_common_util_function_1();
}

// foo_cpp_impl.cpp
#include "utils.h"
#include "foo.h"
int foo_b() {
return my_common_util_function_1();
}

// main.c
#include 
#include "foo.h"
int main() {
printf("%d\n", foo_a());
printf("%d\n", foo_b());
}
Но в приведенном выше примере, когда я компилирую его с помощью следующей команды, он явно терпит неудачу.

Код: Выделить всё

clang -c foo_c_impl.c -o foo_c_impl.o
clang -c foo_cpp_impl.cpp -o foo_cpp_impl.o
clang -c main.c -o main.o
clang foo_c_impl.o foo_cpp_impl.o main.o

# /usr/bin/ld: foo_c_impl.o: in function `foo_a':
# foo_c_impl.c:(.text+0x5): undefined reference to `my_common_util_function_1'
После ознакомления с информацией я узнал, что это, по-видимому, связано с тем, что ключевое слово inline имеет разные значения в C++ и C (раньше я знал об этом только в C++ и думал то же самое было и в C). В C кажется, что я либо
  • пишу файл .c специально для их экстернирования, либо
  • пишу их как статическая строка в C, например:

Код: Выделить всё

#ifdef __cplusplus
#define MY_INLINE inline
#else
#define MY_INLINE static inline
#endif
Но я думаю, что ни одно из этих двух решений не решает мою проблему полностью. Во-первых, я надеюсь, что этот заголовочный файл имеет такое же (или близкое к нему) использование и поведение в C и C++. Во-вторых, в худшем случае, поскольку у меня может быть много модулей компиляции, включающих utils.h, в случае, если компилятор решит не встраивать некоторые служебные функции, использование static inline приведет к тому, что они будут существовать в каждом модуле компиляции.
Итак, я хочу знать, есть ли в C способ полностью имитировать встроенные функции C++? (Включая использование расширений компилятора)
Кроме того, поскольку мой проект работает только на платформе Linux, я узнал, что clang и gcc реализуются в C++ встроенными посредством слабых символов, поэтому я рассмотрел возможность использования __attribute__( (слабый)) и встроенный вместе в C для имитации аналогичных функций, например:

Код: Выделить всё

#ifdef __cplusplus
#define MY_INLINE inline
#else
#define MY_INLINE inline __attribute__((weak))
#endif
После тестирования это можно скомпилировать в Clang, и, похоже, он достигает желаемого эффекта, но gcc выдаст предупреждение: встроенная функция 'my_common_util_function_1' объявлена ​​слабой, и все равно приводит к неопределенной ссылке. Я не уверен, какая сторона ведет себя правильно.


Подробнее здесь: https://stackoverflow.com/questions/793 ... f-c-inline
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»