Method inlined in source1.cpp and called in source2.cpp

A

Alex Vinokur

Is it possible to call in source2.cpp a method inlined in source1.cpp?

--- File foo.h ---
#ifndef FOO_H
#define FOO_H

struct Foo { void foo (); };

#endif
------------------


--- File foo1.cpp ---
#include "foo.h"
inline void Foo::foo() {}
---------------------


--- File foo2.cpp ---
#include "foo.h"

int main ()
{
Foo f;
f.foo();

return 0;
}
---------------------


--- Compilation ---

$ gpp --version
gpp.exe (GCC) 3.4.1
[---omitted---]

$ gpp foo1.cpp foo2.cpp
c:/djgpp/tmp/cckdogiI.o(.text+0x24):foo2.cpp: undefined reference to `Foo::foo()'
collect2: ld returned 1 exit status
 
J

Jason Heyes

Alex Vinokur said:
Is it possible to call in source2.cpp a method inlined in source1.cpp?

--- File foo.h ---
#ifndef FOO_H
#define FOO_H

struct Foo { void foo (); };

#endif
------------------


--- File foo1.cpp ---
#include "foo.h"
inline void Foo::foo() {}
---------------------


--- File foo2.cpp ---
#include "foo.h"

int main ()
{
Foo f;
f.foo();

return 0;
}
---------------------


--- Compilation ---

$ gpp --version
gpp.exe (GCC) 3.4.1
[---omitted---]

$ gpp foo1.cpp foo2.cpp
c:/djgpp/tmp/cckdogiI.o(.text+0x24):foo2.cpp: undefined reference to
`Foo::foo()'
collect2: ld returned 1 exit status

-------------------


--
Alex Vinokur
email: alex DOT vinokur AT gmail DOT com
http://mathforum.org/library/view/10978.html
http://sourceforge.net/users/alexvn

No. You have to inline the function in the header file.
 
G

Gernot Frisch

Alex Vinokur said:
Is it possible to call in source2.cpp a method inlined in
source1.cpp?

--- File foo.h ---
#ifndef FOO_H
#define FOO_H

struct Foo { void foo (); };

#endif
------------------


--- File foo1.cpp ---
#include "foo.h"
inline void Foo::foo() {}
---------------------


--- File foo2.cpp ---
#include "foo.h"

int main ()
{
Foo f;
f.foo();

return 0;
}
---------------------


--- Compilation ---

$ gpp --version
gpp.exe (GCC) 3.4.1
[---omitted---]

$ gpp foo1.cpp foo2.cpp
c:/djgpp/tmp/cckdogiI.o(.text+0x24):foo2.cpp: undefined reference to
`Foo::foo()'
collect2: ld returned 1 exit status

-------------------

3 ways:
- inline in the header
- write an .inc file and include it in the header (for the compiler
that same as writing in the header)
- get an compiler that can handle the export keyword - there's ony one
from comeau and for portability I suggest not to use it.

HTH,
Gernot
 
A

angelo

Gernot said:
- get an compiler that can handle the export keyword - there's ony one
from comeau and for portability I suggest not to use it.

HTH,
Gernot

If I am correct, export is for templates only, right? So in his case
export is not applicable.
 
G

Gernot Frisch

angelo said:
If I am correct, export is for templates only, right? So in his case
export is not applicable.

Ah. Sorry you're totally right. I was writing faster than thinking.
 
T

Thomas Maier-Komor

Gernot said:
Ah. Sorry you're totally right. I was writing faster than thinking.

I think you meant extern inline, which requires an inline declaration
in all translation units and an extern inline definition only in one.
This feature is supported by few compilers.

Tom
 
G

Greg Comeau

Alex Vinokur said:
Is it possible to call in source2.cpp a method inlined in
source1.cpp?

--- File foo.h ---
#ifndef FOO_H
#define FOO_H

struct Foo { void foo (); };

#endif
------------------


--- File foo1.cpp ---
#include "foo.h"
inline void Foo::foo() {}
---------------------


--- File foo2.cpp ---
#include "foo.h"

int main ()
{
Foo f;
f.foo();

return 0;
}
---------------------


--- Compilation ---

$ gpp --version
gpp.exe (GCC) 3.4.1
[---omitted---]

$ gpp foo1.cpp foo2.cpp
c:/djgpp/tmp/cckdogiI.o(.text+0x24):foo2.cpp: undefined reference to
`Foo::foo()'
collect2: ld returned 1 exit status

-------------------

3 ways:
- inline in the header
- write an .inc file and include it in the header (for the compiler
that same as writing in the header)
- get an compiler that can handle the export keyword - there's ony one
from comeau and for portability I suggest not to use it.

If you mean portability across OSs, well Comeau supports the popular
ones and we are always willing and capable to bring it to others,
and in a reasonable timeframe and cost, and of course already do custom
ports with a goal of complete functionality and parts. If you mean
portability across compilers, then sure, this should be given
consideration.

BTW, I may be missing the point, but it seems to me that the
OPS question is strictly about cross translation unit inline'ing,
which hence makes suggesting export mostly a neutral issue.
 
G

Greg Comeau

I think you meant extern inline, which requires an inline declaration
in all translation units and an extern inline definition only in one.

I suspect that you guys are still trying to compare this to export,
that is, every translation unit which uses an inline function should
define it as per ODRing (of course a given compiler may be smarter
than this, but that's a seperate issue).
This feature is supported by few compilers.

Comeau C++ can support extern inline functions too.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,229
Latest member
GloryAngul

Latest Threads

Top