LINUX.ORG.RU

multiple definition of `...'

 ,


0

1

Не могу собрать проект с inline подстановками. Вот например:

head.h:

#include <ctype.h>

inline char* strbegin(char* s)
{
    while( isblank(*s) ) ++s;
    return s;
}

proc.c:

#include "head.h"

main.c:

#include "head.h"

int main(int argc, char* argv[])
{
    return 0;
}

$gcc main.c proc.c

Линковщик сообщает что:

/tmp/ccQRGJfn.o: In function `strbegin':
proc.c:(.text+0x0): multiple definition of `strbegin'
/tmp/ccKc1R22.o:main.c:(.text+0x0): first defined here
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

ЧЯДНТ?

-std=c99

В c99 семантика inline поменялась. Судя по ошибке, это проект c89 и в нём тело данной функции не удаляется. В c99 тела функции не будет, и уйдёт ошибка множественого определения.

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

В c99 семантика inline поменялась

До C99 inline не было. В расширениях разве что.

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

До C99 inline не было. В расширениях разве что.

Да, согласен, это гнушное расширение:

GCC implements three different semantics of declaring a function inline. One is available with -std=gnu89 or -fgnu89-inline or when gnu_inline attribute is present on all inline declarations, another when -std=c99, -std=c11, -std=gnu99 or -std=gnu11 (without -fgnu89-inline), and the third is used when compiling C++.

alexanius ()
Ответ на: комментарий от xaizek

Похудеть не встать, я не все понял что там написано, но понял одно точно - не хочу больше inline, и так сойдет.

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

Серьезно? Твоя проблема решается одним ifdef-ом. Как ymuv сказал. Да блин, в C и C++ вообще любые хедеры принято оборачивать в ifdef или pragma по ряду причин.

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

Она не решится одним ifdefом т.к. компиляторов больше чем два. А в моём случае это вообще ничего не решит.

хедеры оборачивать

А причем тут обёртки хэдэров?

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