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 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
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.
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
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?
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
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
Thanks folks, that clears it up for me This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
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...
|
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"
|
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,...
|
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...
|
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):...
|
by: Bern |
last post by:
hi all,
what is the rule for decorating a symbol in c++?
|
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...
|
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...
|
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 ,
...
|
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...
|
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
|
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...
|
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...
|
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,...
|
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...
|
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,...
|
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...
|
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...
| |