LINUX.ORG.RU

Вопрос по компоновке программы на Си


0

0

Существуют два файла - a.c и b.c, а также главный - main.c, как сделать чтобы по умолчанию файл a.c не мог видеть функции объявленные в b.c (и при этом не объявленные в заголовочном файле). Самый простой вариант мне известен - добавлять static перед определением функции. Как сделать чтобы статическими были все функции по умолчанию?

Например:

// a.h
#ifndef A_H
#define A_H
void start_a();
#endif

// a.c
#include "a.h"
void start_a()
{
 private_func_from_b(); // вот тут компилятор должен обругаться, а на деле ему пофиг
}

// b.h
#ifndef B_H
#define B_H
void start_b();
#endif

// b.c
#include "b.h"
void private_func_from_b()
{
 // <...>
}

void start_b()
{
 // <...>
}

// main.c:
#include "a.h"
#include "b.h"

int main(void)
{
 // <...>
 start_a();
 start_b();
}

>Как сделать чтобы статическими были все функции по умолчанию?
писать на ассемблере?

dimon555 ★★★★★
()

Если функция не объявлена, то в Си по-умолчанию считается, что она объявлена как int func(...), ошибки тут нет, но компилятор может выдать warning.

А линкер ругаться будет только если функция объявлена как static.

Reset ★★★★★
()

мда, мсье знает толк в извращениях…

objcopy `objdump -t file.o | perl -ne '/^\S+\s+g\s+F\s+\.text\s+\S+\s+(\w+)/&&print" -L $1"'` file.o file.all_local.o

где file.o — оригинальный объектник, а file.all_local.o — тот же, но со всеми глобальными функциями, отмеченными как локальные.

arsi ★★★★★
()
Ответ на: комментарий от arsi

> objcopy `objdump -t file.o | perl -ne '/^\S+\s+g\s+F\s+\.text\s+\S+\s+(\w+)/&&print" -L $1"'` file.o file.all_local.o

o_O охренеть.. Спасибо за идею, но в таком случае я лучше ручками выставлю свои полсотни функций как статические...

Просто помоему как-то неправильно это, ведь в файле a.h/a.c я не вставлял #include "b.c" а получается она как-бы есть, лучшеб оно просто ругалося что private_func_from_b это неизвестно что, а не так..

anterior
() автор топика
Ответ на: комментарий от anterior

> лучшеб оно просто ругалося что private_func_from_b это неизвестно что, а не так..

gcc -Wimplicit-function-declaration -Werror=implicit-function-declaration -c -o a.o a.c

если в хедерах, подключаемых из «a.c», нет экстернов/интерфейсов глобальных функций из других сорцов или либ — выдаст ошибку.

arsi ★★★★★
()
Ответ на: комментарий от arsi

> gcc -Wimplicit-function-declaration -Werror=implicit-function-declaration -c -o a.o a.c

Вот, это и есть то о чём я мечтал. Спасибо! :)

anterior
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.