`(void*)` usage used as function parameter instead of `struct *`
Is there any big difference if I use something like this:
void print_struct( void *ptr_to_struct )
instead of:
void print_struct( struct data *ptr_to_struct )
I am asking this because I just got stuck in something what I cannot understand and why it does not work in the following manner:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( struct data *ptr_to_struct )
{
struct data *ptr = ptr_to_struct;
printf("Name = %sn", ptr->name );
}
I get:
error: ‘struct data’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
But if I move:
void print_struct( struct data *ptr_to_struct );
After:
struct data{
char name[ 256 ];
};
Compiles fine.
The thing which I do not understand is the following:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( void *ptr_to_struct );
struct data{
char name[ 256 ];
};
//void print_struct( void *ptr_to_struct );
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( void *ptr_to_struct )
{
struct data *ptr = ( struct data * )ptr_to_struct;
printf("Name = %sn", ptr->name );
}
No mater if I use:
void print_struct( void *ptr_to_struct );
Before or after:
struct data{
char name[ 256 ];
};
The program works fine.
Why is there this difference?
c
add a comment |
Is there any big difference if I use something like this:
void print_struct( void *ptr_to_struct )
instead of:
void print_struct( struct data *ptr_to_struct )
I am asking this because I just got stuck in something what I cannot understand and why it does not work in the following manner:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( struct data *ptr_to_struct )
{
struct data *ptr = ptr_to_struct;
printf("Name = %sn", ptr->name );
}
I get:
error: ‘struct data’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
But if I move:
void print_struct( struct data *ptr_to_struct );
After:
struct data{
char name[ 256 ];
};
Compiles fine.
The thing which I do not understand is the following:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( void *ptr_to_struct );
struct data{
char name[ 256 ];
};
//void print_struct( void *ptr_to_struct );
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( void *ptr_to_struct )
{
struct data *ptr = ( struct data * )ptr_to_struct;
printf("Name = %sn", ptr->name );
}
No mater if I use:
void print_struct( void *ptr_to_struct );
Before or after:
struct data{
char name[ 256 ];
};
The program works fine.
Why is there this difference?
c
add a comment |
Is there any big difference if I use something like this:
void print_struct( void *ptr_to_struct )
instead of:
void print_struct( struct data *ptr_to_struct )
I am asking this because I just got stuck in something what I cannot understand and why it does not work in the following manner:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( struct data *ptr_to_struct )
{
struct data *ptr = ptr_to_struct;
printf("Name = %sn", ptr->name );
}
I get:
error: ‘struct data’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
But if I move:
void print_struct( struct data *ptr_to_struct );
After:
struct data{
char name[ 256 ];
};
Compiles fine.
The thing which I do not understand is the following:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( void *ptr_to_struct );
struct data{
char name[ 256 ];
};
//void print_struct( void *ptr_to_struct );
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( void *ptr_to_struct )
{
struct data *ptr = ( struct data * )ptr_to_struct;
printf("Name = %sn", ptr->name );
}
No mater if I use:
void print_struct( void *ptr_to_struct );
Before or after:
struct data{
char name[ 256 ];
};
The program works fine.
Why is there this difference?
c
Is there any big difference if I use something like this:
void print_struct( void *ptr_to_struct )
instead of:
void print_struct( struct data *ptr_to_struct )
I am asking this because I just got stuck in something what I cannot understand and why it does not work in the following manner:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( struct data *ptr_to_struct )
{
struct data *ptr = ptr_to_struct;
printf("Name = %sn", ptr->name );
}
I get:
error: ‘struct data’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
But if I move:
void print_struct( struct data *ptr_to_struct );
After:
struct data{
char name[ 256 ];
};
Compiles fine.
The thing which I do not understand is the following:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( void *ptr_to_struct );
struct data{
char name[ 256 ];
};
//void print_struct( void *ptr_to_struct );
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( void *ptr_to_struct )
{
struct data *ptr = ( struct data * )ptr_to_struct;
printf("Name = %sn", ptr->name );
}
No mater if I use:
void print_struct( void *ptr_to_struct );
Before or after:
struct data{
char name[ 256 ];
};
The program works fine.
Why is there this difference?
c
c
asked Nov 20 '18 at 19:16
Michael B.
1248
1248
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
When you refer to an unknown
struct something
type in a function prototype, it effectively declares a new struct type. However, the new type will be local to that prototype. The new type will not be related to any identically namesstruct something
type declared afterwards. For example
void foo(struct S *p) {}
struct S { int i; };
int main(void) {
struct S s;
foo(&s); // ERROR: the pointer types are unrelated
}
Basically, don't do that. Don't use unknown
struct something
types in function prototypes. It is pointless. It is virtually always an indication of a typo or some other error. This is why the compiler is issuing a warning.
Such struct types have to be declared before the prototype. You can rearrange your declarations (as you already tried). Or you can pre-declare the struct type
struct data;
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
This will also work properly.
Declaring a function prototype with a parameter type
void *
and then defining the same function with parameter ofstruct something *
type leads to undefined behavior, even if your program appears to "work fine".
So If I use it Like this it is fine, or can lead toUB
?
– Michael B.
Nov 20 '18 at 19:27
@Michael B.: What you have at that link looks fine. Someconst
qualifiers are completely unjustified though.
– AnT
Nov 20 '18 at 19:43
Some const qualifiers are completely unjustified
Why is that? I mean The purpose there is to tell the Compiler that I am not touching that pointer or its pointed value. Or I am wrong?
– Michael B.
Nov 20 '18 at 19:48
@Michael B: Well, in that case make it consistent: inside yourprint_struct
declareptr
asconst struct data *ptr
. That will also make the cast unnecessary. Currently you use that cast to cast some of yourconst
s away. What's the point of usingconst
if you are going to immediately cast it away anyway?
– AnT
Nov 20 '18 at 19:59
I understand now. Thank you.
– Michael B.
Nov 20 '18 at 20:43
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53400023%2fvoid-usage-used-as-function-parameter-instead-of-struct%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
When you refer to an unknown
struct something
type in a function prototype, it effectively declares a new struct type. However, the new type will be local to that prototype. The new type will not be related to any identically namesstruct something
type declared afterwards. For example
void foo(struct S *p) {}
struct S { int i; };
int main(void) {
struct S s;
foo(&s); // ERROR: the pointer types are unrelated
}
Basically, don't do that. Don't use unknown
struct something
types in function prototypes. It is pointless. It is virtually always an indication of a typo or some other error. This is why the compiler is issuing a warning.
Such struct types have to be declared before the prototype. You can rearrange your declarations (as you already tried). Or you can pre-declare the struct type
struct data;
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
This will also work properly.
Declaring a function prototype with a parameter type
void *
and then defining the same function with parameter ofstruct something *
type leads to undefined behavior, even if your program appears to "work fine".
So If I use it Like this it is fine, or can lead toUB
?
– Michael B.
Nov 20 '18 at 19:27
@Michael B.: What you have at that link looks fine. Someconst
qualifiers are completely unjustified though.
– AnT
Nov 20 '18 at 19:43
Some const qualifiers are completely unjustified
Why is that? I mean The purpose there is to tell the Compiler that I am not touching that pointer or its pointed value. Or I am wrong?
– Michael B.
Nov 20 '18 at 19:48
@Michael B: Well, in that case make it consistent: inside yourprint_struct
declareptr
asconst struct data *ptr
. That will also make the cast unnecessary. Currently you use that cast to cast some of yourconst
s away. What's the point of usingconst
if you are going to immediately cast it away anyway?
– AnT
Nov 20 '18 at 19:59
I understand now. Thank you.
– Michael B.
Nov 20 '18 at 20:43
add a comment |
When you refer to an unknown
struct something
type in a function prototype, it effectively declares a new struct type. However, the new type will be local to that prototype. The new type will not be related to any identically namesstruct something
type declared afterwards. For example
void foo(struct S *p) {}
struct S { int i; };
int main(void) {
struct S s;
foo(&s); // ERROR: the pointer types are unrelated
}
Basically, don't do that. Don't use unknown
struct something
types in function prototypes. It is pointless. It is virtually always an indication of a typo or some other error. This is why the compiler is issuing a warning.
Such struct types have to be declared before the prototype. You can rearrange your declarations (as you already tried). Or you can pre-declare the struct type
struct data;
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
This will also work properly.
Declaring a function prototype with a parameter type
void *
and then defining the same function with parameter ofstruct something *
type leads to undefined behavior, even if your program appears to "work fine".
So If I use it Like this it is fine, or can lead toUB
?
– Michael B.
Nov 20 '18 at 19:27
@Michael B.: What you have at that link looks fine. Someconst
qualifiers are completely unjustified though.
– AnT
Nov 20 '18 at 19:43
Some const qualifiers are completely unjustified
Why is that? I mean The purpose there is to tell the Compiler that I am not touching that pointer or its pointed value. Or I am wrong?
– Michael B.
Nov 20 '18 at 19:48
@Michael B: Well, in that case make it consistent: inside yourprint_struct
declareptr
asconst struct data *ptr
. That will also make the cast unnecessary. Currently you use that cast to cast some of yourconst
s away. What's the point of usingconst
if you are going to immediately cast it away anyway?
– AnT
Nov 20 '18 at 19:59
I understand now. Thank you.
– Michael B.
Nov 20 '18 at 20:43
add a comment |
When you refer to an unknown
struct something
type in a function prototype, it effectively declares a new struct type. However, the new type will be local to that prototype. The new type will not be related to any identically namesstruct something
type declared afterwards. For example
void foo(struct S *p) {}
struct S { int i; };
int main(void) {
struct S s;
foo(&s); // ERROR: the pointer types are unrelated
}
Basically, don't do that. Don't use unknown
struct something
types in function prototypes. It is pointless. It is virtually always an indication of a typo or some other error. This is why the compiler is issuing a warning.
Such struct types have to be declared before the prototype. You can rearrange your declarations (as you already tried). Or you can pre-declare the struct type
struct data;
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
This will also work properly.
Declaring a function prototype with a parameter type
void *
and then defining the same function with parameter ofstruct something *
type leads to undefined behavior, even if your program appears to "work fine".
When you refer to an unknown
struct something
type in a function prototype, it effectively declares a new struct type. However, the new type will be local to that prototype. The new type will not be related to any identically namesstruct something
type declared afterwards. For example
void foo(struct S *p) {}
struct S { int i; };
int main(void) {
struct S s;
foo(&s); // ERROR: the pointer types are unrelated
}
Basically, don't do that. Don't use unknown
struct something
types in function prototypes. It is pointless. It is virtually always an indication of a typo or some other error. This is why the compiler is issuing a warning.
Such struct types have to be declared before the prototype. You can rearrange your declarations (as you already tried). Or you can pre-declare the struct type
struct data;
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
This will also work properly.
Declaring a function prototype with a parameter type
void *
and then defining the same function with parameter ofstruct something *
type leads to undefined behavior, even if your program appears to "work fine".
edited Nov 20 '18 at 19:25
answered Nov 20 '18 at 19:20
AnT
257k32410654
257k32410654
So If I use it Like this it is fine, or can lead toUB
?
– Michael B.
Nov 20 '18 at 19:27
@Michael B.: What you have at that link looks fine. Someconst
qualifiers are completely unjustified though.
– AnT
Nov 20 '18 at 19:43
Some const qualifiers are completely unjustified
Why is that? I mean The purpose there is to tell the Compiler that I am not touching that pointer or its pointed value. Or I am wrong?
– Michael B.
Nov 20 '18 at 19:48
@Michael B: Well, in that case make it consistent: inside yourprint_struct
declareptr
asconst struct data *ptr
. That will also make the cast unnecessary. Currently you use that cast to cast some of yourconst
s away. What's the point of usingconst
if you are going to immediately cast it away anyway?
– AnT
Nov 20 '18 at 19:59
I understand now. Thank you.
– Michael B.
Nov 20 '18 at 20:43
add a comment |
So If I use it Like this it is fine, or can lead toUB
?
– Michael B.
Nov 20 '18 at 19:27
@Michael B.: What you have at that link looks fine. Someconst
qualifiers are completely unjustified though.
– AnT
Nov 20 '18 at 19:43
Some const qualifiers are completely unjustified
Why is that? I mean The purpose there is to tell the Compiler that I am not touching that pointer or its pointed value. Or I am wrong?
– Michael B.
Nov 20 '18 at 19:48
@Michael B: Well, in that case make it consistent: inside yourprint_struct
declareptr
asconst struct data *ptr
. That will also make the cast unnecessary. Currently you use that cast to cast some of yourconst
s away. What's the point of usingconst
if you are going to immediately cast it away anyway?
– AnT
Nov 20 '18 at 19:59
I understand now. Thank you.
– Michael B.
Nov 20 '18 at 20:43
So If I use it Like this it is fine, or can lead to
UB
?– Michael B.
Nov 20 '18 at 19:27
So If I use it Like this it is fine, or can lead to
UB
?– Michael B.
Nov 20 '18 at 19:27
@Michael B.: What you have at that link looks fine. Some
const
qualifiers are completely unjustified though.– AnT
Nov 20 '18 at 19:43
@Michael B.: What you have at that link looks fine. Some
const
qualifiers are completely unjustified though.– AnT
Nov 20 '18 at 19:43
Some const qualifiers are completely unjustified
Why is that? I mean The purpose there is to tell the Compiler that I am not touching that pointer or its pointed value. Or I am wrong?– Michael B.
Nov 20 '18 at 19:48
Some const qualifiers are completely unjustified
Why is that? I mean The purpose there is to tell the Compiler that I am not touching that pointer or its pointed value. Or I am wrong?– Michael B.
Nov 20 '18 at 19:48
@Michael B: Well, in that case make it consistent: inside your
print_struct
declare ptr
as const struct data *ptr
. That will also make the cast unnecessary. Currently you use that cast to cast some of your const
s away. What's the point of using const
if you are going to immediately cast it away anyway?– AnT
Nov 20 '18 at 19:59
@Michael B: Well, in that case make it consistent: inside your
print_struct
declare ptr
as const struct data *ptr
. That will also make the cast unnecessary. Currently you use that cast to cast some of your const
s away. What's the point of using const
if you are going to immediately cast it away anyway?– AnT
Nov 20 '18 at 19:59
I understand now. Thank you.
– Michael B.
Nov 20 '18 at 20:43
I understand now. Thank you.
– Michael B.
Nov 20 '18 at 20:43
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53400023%2fvoid-usage-used-as-function-parameter-instead-of-struct%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown