|
George_George wrote: I mean how linker utilize the import library to generate two forms of call statement
George_George wrote: one for the case with dllimport
how call statement is mapped to indirect pointer to IAT slot is extracted in the previous reply.
George_George wrote: one for the case without dllimport
without dllimport means the function is statically linked, that is linker knows the address of the function,
Without __declspec(dllimport), given this code:
void func1(void);
void main(void)
{
func1();
}
the compiler generates code that looks like this:
call func1
and the linker translates the call into something like this:
call 0x4000000 ; The address of 'func1'.
the address of the function is already known to the linker.
If
func1
exists in another DLL, the linker can't resolve this directly because it has no way of knowing what the address of
func1
is.
and the remaining section decribes the technique used for dllimport.
|
|
|
|
|
Thanks Rajkumar,
Why import library can not decide the address of the import function? Because of the address can not be decide until load time -- DLL rebase or?
regards,
George
|
|
|
|
|
Hello everyone,
Sometimes, we allocate array of zero elements. I am wondering for what regualr purpose will we do that?
I have tested that in Visual Studio 2008, it runs ok.
int main()
{
char* buf = new char [0];
delete[] buf;
return 0;
}
thanks in advance,
George
|
|
|
|
|
It works, but it's Microsoft specific, you may have problem on different platforms.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
modified on Sunday, February 17, 2008 9:51 AM
|
|
|
|
|
i think it is C++ standard,
§5.3.4/7: "When the value of the expression in a direct-new-declarator is zero, the allocation function is called to allocate an array with no elements."
|
|
|
|
|
You're right. Maybe I was too drunk.
the following one is the non-standard I was (wrongly) addressing
struct A
{
int a[0];
};
Thanks.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
CPallini wrote: Maybe I was too drunk
I think u r too drunk, as u r not sure that u r too drunk
|
|
|
|
|
Can not compile in Visual Studio 2008.
regards,
George
|
|
|
|
|
u mean this
struct A{
int a[0];
};
i don't know about 2008, VS2005 gives warning in C++ when warning level is greater than 1. previous version needs the option /Ze (ms extension).
following is same as above and compiles in VS2005 as above and also found in GCC
struct A{
int a[];
};
|
|
|
|
|
Thanks Rajkumar,
Here is the compile error message in Visual Studio 2008. With warning level 3 -- default one.
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C2146: syntax error : missing ';' before identifier 'mean'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C2143: syntax error : missing ';' before 'this'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : error C2143: syntax error : missing ';' before '{'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : error C2447: '{' : missing function header (old-style formal list?)
Looks like int a[0] can not be used.
regards,
George
|
|
|
|
|
can u post the code, it seams something else.
|
|
|
|
|
Sorry Rajkumar,
You are correct. I posted the wrong output and source codes.
Here is the current version, please review.
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : warning C4200: nonstandard extension used : zero-sized array in struct/union
Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
struct A{
int a[0];
};
environment Visual Studio 2008 and warning level 3 (default).
regards,
George
|
|
|
|
|
so no change for this behavior from VC2005 to VC2008, change the warning level to 1, i think u won't get warning also.
|
|
|
|
|
Thanks Rajkumar,
I have verified you are correct.
regards,
George
|
|
|
|
|
|
George_George wrote: Sometimes, we allocate array of zero elements. I am wondering for what regualr purpose will we do that?
It seems u used to allocate. sometimes
without any regular purpose?
char *ptr = new char[0];
eventhough empty, returns unique value of address, any trick using that?
modified on Sunday, February 17, 2008 10:02 AM
|
|
|
|
|
Thanks Rajkumar,
Do you have any experience of using in this way?
regards,
George
|
|
|
|
|
George_George wrote: Sometimes, we allocate array of zero elements.
We? We who?
Alcohol. The cause of, and the solution to, all of life's problems - Homer Simpson
|
|
|
|
|
Thanks kakan,
I mean I am reading code by others.
regards,
George
|
|
|
|
|
Not exactly we.
|
|
|
|
|
Hello everyone,
We always write const int other than int const, are they the same?
Example,
int const & x = 10;
const int& y = 10;
thanks in advance,
George
|
|
|
|
|
type qualifiers are used to modify the property of type of the identifier.
so,
"int const x" and "const int x" are same, as const qualifier modifies the type "int" of identifier x.
the change of qualifier position has effect say,
"int const *x" and "int *const x" this is different, as const qualifier modifies the type "int" of expression (*x) for former and const qualifier modifies the type "int *" of identifier "x" for later.
and "int const *x" and "const int *x" are same, as both const qualifier modifies the type "int" of expression (*x)
similarly "int const &x" and "const int &y" are same and "int const &x" and "int & const x" are different although the later is ignored.
modified on Sunday, February 17, 2008 10:24 PM
|
|
|
|
|
Thanks Rajkumar,
Rajkumar R wrote: "int const &x" and "int & const x" are different although the former is not allowed.
Why the former "int const &x" is not allowed? The following code can compile in Visual Studio 2008.
int main()
{
int const &x = 10;
return 0;
}
regards,
George
|
|
|
|
|
sorry typo error i mean "later", fixed.
|
|
|
|
|
No Rajkumar,
it is allowed, but always ignored, since reference are always const.
Here is the code and related warning message,
main.cpp(4) : warning C4227: anachronism used : qualifiers on reference are ignored
int main()
{
int i = 100;
int & const x = i;
return 0;
}
regards,
George
|
|
|
|