C: игнорировать второе определение функции, если оно уже определено - PullRequest
1 голос
/ 06 июня 2019

У меня есть два файла, записанных в C, где первый файл содержит другую реализацию нескольких функций, которые уже реализованы во втором файле.Есть ли способ сказать clang - «Если функция уже реализована в File1, то использовать эту реализацию вместо реализации File2»?Я понимаю, что это ужасная идея, хрупкая, неясная ... но мне все еще было интересно, открыт ли компилятор для такого неправильного использования / злоупотребления?

1 Ответ

0 голосов
/ 06 июня 2019

Если вы поместите подчиненную функцию в библиотеку и свяжете ее с объектным файлом вышестоящей функции и этой библиотекой, компоновщик проигнорирует подчиненную функцию.

Редактировать:

Этоis "so1.c":

#include <stdio.h>

void f(void) {
  puts("One.");
}

Это "so2.c":

#include <stdio.h>

void f(void) {
  puts("2!");
}

Это "som.c" (объявление f() могло бытьв дополнительном заголовочном файле):

void f(void);

int main(void) {
  f();
  return 0;
}

Это команда для проверки этого:

clang -c so1.c -o so1.o
clang -c so2.c -o so2.o
clang -c som.c -o som.o
ar r so1.lib so1.o
ar r so2.lib so2.o
clang so1.o   so2.o   som.o -o so12
clang so1.lib so2.o   som.o -o so_2
clang so1.o   so2.lib som.o -o so1_
so_2
so1_

Строка clang so1.o so2.o som.o -o so12 не связывается и выдает ошибку, как и ожидалось.

Оба исполняемых файла работают должным образом.

...