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
Код: Выделить всё
#include "utils.h"
#include "foo.h"
int foo_a() {
return my_common_util_function_1();
}
Код: Выделить всё
#include "utils.h"
#include "foo.h"
int foo_b() {
return my_common_util_function_1();
}
Код: Выделить всё
#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'
- пишу файл .c специально для их экстернирования, либо
- Запишите их как статические встроенные на C, например:
Код: Выделить всё
#ifdef __cplusplus #define MY_INLINE inline #else #define MY_INLINE static inline #endif
Итак, я хочу знать, есть ли в C способ полностью имитировать встроенные функции C++ (включая использование расширений компилятора)?
Кроме того, поскольку мой проект только на платформе Linux я узнал, что clang и gcc реализуют встроенный в C++ посредством слабых символов, поэтому я подумал об использовании __attribute__((weak)) и встроенного вместе в C для имитации аналогичных функций. , вот так:
Код: Выделить всё
#ifdef __cplusplus
#define MY_INLINE inline
#else
#define MY_INLINE inline __attribute__((weak))
#endif
встроенная функция «my_common_util_function_1» объявлена слабой
Я не уверен, какая сторона ведет себя правильно.
Изменить:
Мое желание избежать статического встроенного в C в основном основано на проблемах, упомянутых в этом ответе.Изменить:
Мое желание избежать статического встроенного в C в основном основано на проблемах, упомянутых в этом ответе.Изменить:
Мое желание избежать статического встроенного в C в основном основано на проблемах, упомянутых в этом ответе. p>
Одна вещь, которую я не указал в предыдущем описании и которая может вызвать путаницу, это то, что функции в utils.h на самом деле генерируются автоматически. Большинство из них короткие, но некоторые могут быть не такими короткими. Я надеюсь, что оптимизация компилятора сможет решить, следует ли их встраивать. Если некоторые из этих функций не встроены из-за их большого размера, я надеюсь, что их также можно будет объединить во время компоновки вместо хранения нескольких копий.
Подробнее здесь: https://stackoverflow.com/questions/793 ... f-c-inline
Мобильная версия