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__((weak)) и встроенного вместе в C для имитации аналогичных функций. , вот так:

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

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

встроенная функция «my_common_util_function_1» объявлена ​​слабой

Я не уверен, какая сторона ведет себя правильно.

Изменить:
Мое желание избежать статического встроенного в C в основном основано на проблемах, упомянутых в этом ответе.Изменить:
Мое желание избежать статического встроенного в C в основном основано на проблемах, упомянутых в этом ответе.Изменить:
Мое желание избежать статического встроенного в C в основном основано на проблемах, упомянутых в этом ответе. p>
Одна вещь, которую я не указал в предыдущем описании и которая может вызвать путаницу, это то, что функции в utils.h на самом деле генерируются автоматически. Большинство из них короткие, но некоторые могут быть не такими короткими. Я надеюсь, что оптимизация компилятора сможет решить, следует ли их встраивать. Если некоторые из этих функций не встроены из-за их большого размера, я надеюсь, что их также можно будет объединить во время компоновки вместо хранения нескольких копий.

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

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

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

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

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

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