473,396 Members | 1,734 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

name decoration - why does this example code compile?

Hi,

I'm about half way through Bruce Eckels thinking in C++ Vol 1. He gives
a very short example of how compiler function name decoration helps
remove subtle bugs by type-safe linkage. However, upon looking at the
example i understand why it fails to link but don't understand why it
even compiles. Here's the code, which split between 2 files Def.cpp and
Use.cpp:

//File Def.cpp
//Function definition
void f(int) {}

In the second file, the function is misdeclared and then called:
//File Use.cpp
//Function misdeclaration
void f(char);

int main() {
f(1); // Causes a linker error
}

I thought that C++ forces the user to declare all functions before use
so it can perform compile time error checking e.g. against proper type
usage. In the above example i would have expected the compiler to throw
up an error because in creating the object file for Use.cpp it would
see that i declare a function that takes a char but actually call it
with an integer. However, it does compile, and only barfs during the
link stage as it can't find the function definition of the version that
takes a char argument.
Can anyone tell me why it compiles?
Also, as a side question i also thought C++ forces the user to define
function arguments with a variable name, but again in Def.cpp the
function is defined only with a variable type.

Thanks in advance

May 17 '06 #1
8 2328
mastermagrath wrote:
Hi,

I'm about half way through Bruce Eckels thinking in C++ Vol 1. He gives
a very short example of how compiler function name decoration helps
remove subtle bugs by type-safe linkage. However, upon looking at the
example i understand why it fails to link but don't understand why it
even compiles. Here's the code, which split between 2 files Def.cpp and
Use.cpp:

//File Def.cpp
//Function definition
void f(int) {}

In the second file, the function is misdeclared and then called:

//File Use.cpp
//Function misdeclaration
void f(char);

int main() {
f(1); // Causes a linker error
}

I thought that C++ forces the user to declare all functions before use
so it can perform compile time error checking e.g. against proper type
usage.
Yes it does.
In the above example i would have expected the compiler to throw
up an error because in creating the object file for Use.cpp it would
see that i declare a function that takes a char but actually call it
with an integer.
An int can be implictly converted to a char. This would have failed:

class A {};

void f(A a);

int main()
{
f(3); // cannot convert int 3 to an A
}
However, it does compile, and only barfs during the
link stage as it can't find the function definition of the version that
takes a char argument.
Can anyone tell me why it compiles?
It compiles because the code is legal. It doesn't link because void
f(char) is never defined.

Understand that the compiler has no "memory" between translation units.
As a programmer, you may know that f(int) and f(char) are intended to
be the same function, but for the compiler, everything is perfectly
kosher. However, the linker, which is in charge of "mapping" function
declaration to function definition, cannot find the required definition
and thus reports an error.
Also, as a side question i also thought C++ forces the user to define
function arguments with a variable name, but again in Def.cpp the
function is defined only with a variable type.


You thought wrong.
Jonathan

May 17 '06 #2
The number 1 is also a char. A char is just a number between 0 and 255.
Characters like 'A' are just aliases for the ascii number ( i.e. 'A' =
0x41).
That's why the type-checking doesn't fail and only the linker complains.

May 17 '06 #3
l...@gmx.de wrote:

Please learn to quote correctly
(http://en.wikipedia.org/wiki/Top-pos...ing.2Ftrimming and
http://cfaj.freeshell.org/google/).
The number 1 is also a char.
No. The litteral 1 is an int, but an int can be implictly converted to
a char.
A char is just a number between 0 and 255.
No. A char is a data type which is at least 1 byte and a byte is at
least 8 bits. Also, whether it is signed or not is implementation
defined. To be safe, you can only assume a char has a range of [0,
127].
Characters like 'A' are just aliases for the ascii number ( i.e. 'A' =
0x41).
Again, no. Characters have the value of the underlying character set:
ASCII on ASCII machines, EBCDIC on EBCDIC machines, etc.
That's why the type-checking doesn't fail and only the linker complains.


The reason it doesn't fail is simply that chars are implictly
convertible to int.

Check your facts before posting.
Jonathan

May 17 '06 #4
dj
Jonathan Mcdougall wrote:
mastermagrath wrote:
Hi,

I'm about half way through Bruce Eckels thinking in C++ Vol 1. He gives
a very short example of how compiler function name decoration helps
remove subtle bugs by type-safe linkage. However, upon looking at the
example i understand why it fails to link but don't understand why it
even compiles. Here's the code, which split between 2 files Def.cpp and
Use.cpp:

//File Def.cpp
//Function definition
void f(int) {}

In the second file, the function is misdeclared and then called:

//File Use.cpp
//Function misdeclaration
void f(char);

int main() {
f(1); // Causes a linker error
}

I thought that C++ forces the user to declare all functions before use
so it can perform compile time error checking e.g. against proper type
usage.


Yes it does.
In the above example i would have expected the compiler to throw
up an error because in creating the object file for Use.cpp it would
see that i declare a function that takes a char but actually call it
with an integer.


An int can be implictly converted to a char. This would have failed:

class A {};

void f(A a);

int main()
{
f(3); // cannot convert int 3 to an A
}
However, it does compile, and only barfs during the
link stage as it can't find the function definition of the version that
takes a char argument.
Can anyone tell me why it compiles?


It compiles because the code is legal. It doesn't link because void
f(char) is never defined.

Understand that the compiler has no "memory" between translation units.
As a programmer, you may know that f(int) and f(char) are intended to
be the same function, but for the compiler, everything is perfectly
kosher. However, the linker, which is in charge of "mapping" function
declaration to function definition, cannot find the required definition
and thus reports an error.
Also, as a side question i also thought C++ forces the user to define
function arguments with a variable name, but again in Def.cpp the
function is defined only with a variable type.


You thought wrong.
Jonathan


What is the difference if the function f(char) in file use.cpp is
declared extern?
May 17 '06 #5
dj wrote:
Jonathan Mcdougall wrote:
mastermagrath wrote:
//File Def.cpp
//Function definition
void f(int) {}

In the second file, the function is misdeclared and then called:

//File Use.cpp
//Function misdeclaration
void f(char);

int main() {
f(1); // Causes a linker error
}

However, it does compile, and only barfs during the
link stage as it can't find the function definition of the version that
takes a char argument.
Can anyone tell me why it compiles?


It compiles because the code is legal. It doesn't link because void
f(char) is never defined.


What is the difference if the function f(char) in file use.cpp is
declared extern?


None whatsoever. A function always has external linkage (unless it is
static), so adding "extern" is redundant.
Jonathan

May 17 '06 #6
On 17 May 2006 05:19:57 -0700, "Jonathan Mcdougall"
<jo***************@gmail.com> wrote in comp.lang.c++:
l...@gmx.de wrote:

Please learn to quote correctly
(http://en.wikipedia.org/wiki/Top-pos...ing.2Ftrimming and
http://cfaj.freeshell.org/google/).
The number 1 is also a char.
No. The litteral 1 is an int, but an int can be implictly converted to
a char.
A char is just a number between 0 and 255.


No. A char is a data type which is at least 1 byte and a byte is at


No. A char is a data type which is exactly 1 byte, by definition. Even
on platforms where CHAR_BIT is 16 or 32 (fairly common today on DSPs).
least 8 bits. Also, whether it is signed or not is implementation
defined. To be safe, you can only assume a char has a range of [0,
127].


The rest is OK.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://c-faq.com/
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
May 18 '06 #7
Jack Klein wrote:
<jo***************@gmail.com> wrote in comp.lang.c++:
No. A char is a data type which is at least 1 byte and a byte is at


No. A char is a data type which is exactly 1 byte, by definition. Even
on platforms where CHAR_BIT is 16 or 32 (fairly common today on DSPs).


I was already thinking about the "at least 8 bits" part. My mistake.
Jonathan

May 18 '06 #8
Thanks folks, that clears it up for me

May 18 '06 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Sean Ross | last post by:
Set, Mark, and Apply Decoration Provide a means to set the decoration that will be applied to all marked functions (and maybe classes) within a scope (module, class, or function). For example...
15
by: middletree | last post by:
How do I request the actual page name that I'm on? This is going to go into an include file, and depending on which page I'm on, I'd like to do different things. I'm looking for "pagename.asp"
14
by: Andrew Tang | last post by:
Hi, I need some help with understanding this piece of css. <u>This is a <a href="#" style="text-decoration:none;">hyperlink</a> with surrounding underlining</u> From what I understand of css,...
3
by: Christian Roth | last post by:
What I want: <p style="text-decoration: line-through"> Stricken <span style="text-decoration: none">not stricken</span> </p> , where "Stricken " should be the only thing that is lined...
18
by: Ralf W. Grosse-Kunstleve | last post by:
My initial proposal (http://cci.lbl.gov/~rwgk/python/adopt_init_args_2005_07_02.html) didn't exactly get a warm welcome... And Now for Something Completely Different: class autoinit(object):...
8
by: Bern | last post by:
hi all, what is the rule for decorating a symbol in c++?
6
by: yyy | last post by:
my question is rather theoretical than practical in the pure programming aspect... is "name mangling" the same as "name decorating" ? browsing the web, you might find multiple people saying...
5
by: David Alasiga | last post by:
Does g++ have option to disable function name commingle. When I compile like: g++ -S Test.cpp the file Test.s has function name commingled. For example, function name foo becomes like...
6
by: William | last post by:
for example, I have a global object: extern Object myobj; Can gcc get this object by using string "myobj" at runtime?? I know C++ rtti doesnt support this, but I dont know if gcc can , ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.