declare as function pointer and initialize in the same lineWhat are the differences between a pointer variable and a reference variable in C++?What is a smart pointer and when should I use one?Returning unique_ptr from functionsWhy is reading lines from stdin much slower in C++ than Python?Image Processing: Algorithm Improvement for 'Coca-Cola Can' RecognitionWhy should I use a pointer rather than the object itself?Replacing a 32-bit loop counter with 64-bit introduces crazy performance deviationsFunction pointer, which can point to every thing?Has a std::byte pointer the same aliasing implications as char*?declare and define function pointer variable in one line
How could indestructible materials be used in power generation?
Why no variance term in Bayesian logistic regression?
Short story with a alien planet, government officials must wear exploding medallions
Is there a hemisphere-neutral way of specifying a season?
Avoiding the "not like other girls" trope?
Extract rows of a table, that include less than x NULLs
CAST throwing error when run in stored procedure but not when run as raw query
Is it logically or scientifically possible to artificially send energy to the body?
I would say: "You are another teacher", but she is a woman and I am a man
Unlock My Phone! February 2018
Running Low on Limestone
What type of content (depth/breadth) is expected for a short presentation for Asst Professor interview in the UK?
ssTTsSTtRrriinInnnnNNNIiinngg
Forgetting the musical notes while performing in concert
What exploit Are these user agents trying to use?
Method Does Not Exist error message
Is "remove commented out code" correct English?
Ambiguity in the definition of entropy
If human space travel is limited by the G force vulnerability, is there a way to counter G forces?
In 'Revenger,' what does 'cove' come from?
Mathematica command that allows it to read my intentions
How much of data wrangling is a data scientist's job?
What is the idiomatic way to say "clothing fits"?
How to compactly explain secondary and tertiary characters without resorting to stereotypes?
declare as function pointer and initialize in the same line
What are the differences between a pointer variable and a reference variable in C++?What is a smart pointer and when should I use one?Returning unique_ptr from functionsWhy is reading lines from stdin much slower in C++ than Python?Image Processing: Algorithm Improvement for 'Coca-Cola Can' RecognitionWhy should I use a pointer rather than the object itself?Replacing a 32-bit loop counter with 64-bit introduces crazy performance deviationsFunction pointer, which can point to every thing?Has a std::byte pointer the same aliasing implications as char*?declare and define function pointer variable in one line
In C++ how do we do the following
// fundamental language construct
type name = value;
// for example
int x = y;
with function pointers?
typedef char(*FP)(unsigned);
// AFAIK not possible in C++
FP x = y;
I can use lambdas
FP x = [](unsigned k) -> char return char(k); ;
But I do not know how to do this without lambda. Any ideas? This is not an answer. we know this works:
void whatever ()
typedef void (*FP) (void);
FP x = whatever;
The question is if one can do this in one line in C++. Like one can do it in one line in C++ with every other type kind.
c++
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
In C++ how do we do the following
// fundamental language construct
type name = value;
// for example
int x = y;
with function pointers?
typedef char(*FP)(unsigned);
// AFAIK not possible in C++
FP x = y;
I can use lambdas
FP x = [](unsigned k) -> char return char(k); ;
But I do not know how to do this without lambda. Any ideas? This is not an answer. we know this works:
void whatever ()
typedef void (*FP) (void);
FP x = whatever;
The question is if one can do this in one line in C++. Like one can do it in one line in C++ with every other type kind.
c++
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
5
You could always stick withauto x = &the_function;'.
– François Andrieux
Mar 28 at 14:48
1
The name of a function pointer variable appears between the return type and the arguments It won't look liketype name = value;.
– François Andrieux
Mar 28 at 14:48
You're missing the&beforewhatever.FP x = &whatever ;
– dave
Mar 28 at 14:49
1
@dave: That's the same for functions, you don't need the ampersand. @emma: Why should that not be possible in C++? This should work fine (except for the(char), which should becharin yourtypedef)
– andreee
Mar 28 at 14:52
add a comment |
In C++ how do we do the following
// fundamental language construct
type name = value;
// for example
int x = y;
with function pointers?
typedef char(*FP)(unsigned);
// AFAIK not possible in C++
FP x = y;
I can use lambdas
FP x = [](unsigned k) -> char return char(k); ;
But I do not know how to do this without lambda. Any ideas? This is not an answer. we know this works:
void whatever ()
typedef void (*FP) (void);
FP x = whatever;
The question is if one can do this in one line in C++. Like one can do it in one line in C++ with every other type kind.
c++
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
In C++ how do we do the following
// fundamental language construct
type name = value;
// for example
int x = y;
with function pointers?
typedef char(*FP)(unsigned);
// AFAIK not possible in C++
FP x = y;
I can use lambdas
FP x = [](unsigned k) -> char return char(k); ;
But I do not know how to do this without lambda. Any ideas? This is not an answer. we know this works:
void whatever ()
typedef void (*FP) (void);
FP x = whatever;
The question is if one can do this in one line in C++. Like one can do it in one line in C++ with every other type kind.
c++
c++
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited yesterday
atomsymbol
21859
21859
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked Mar 28 at 14:46
emma brainemma brain
1986
1986
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
emma brain is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
5
You could always stick withauto x = &the_function;'.
– François Andrieux
Mar 28 at 14:48
1
The name of a function pointer variable appears between the return type and the arguments It won't look liketype name = value;.
– François Andrieux
Mar 28 at 14:48
You're missing the&beforewhatever.FP x = &whatever ;
– dave
Mar 28 at 14:49
1
@dave: That's the same for functions, you don't need the ampersand. @emma: Why should that not be possible in C++? This should work fine (except for the(char), which should becharin yourtypedef)
– andreee
Mar 28 at 14:52
add a comment |
5
You could always stick withauto x = &the_function;'.
– François Andrieux
Mar 28 at 14:48
1
The name of a function pointer variable appears between the return type and the arguments It won't look liketype name = value;.
– François Andrieux
Mar 28 at 14:48
You're missing the&beforewhatever.FP x = &whatever ;
– dave
Mar 28 at 14:49
1
@dave: That's the same for functions, you don't need the ampersand. @emma: Why should that not be possible in C++? This should work fine (except for the(char), which should becharin yourtypedef)
– andreee
Mar 28 at 14:52
5
5
You could always stick with
auto x = &the_function;'.– François Andrieux
Mar 28 at 14:48
You could always stick with
auto x = &the_function;'.– François Andrieux
Mar 28 at 14:48
1
1
The name of a function pointer variable appears between the return type and the arguments It won't look like
type name = value;.– François Andrieux
Mar 28 at 14:48
The name of a function pointer variable appears between the return type and the arguments It won't look like
type name = value;.– François Andrieux
Mar 28 at 14:48
You're missing the
& before whatever. FP x = &whatever ;– dave
Mar 28 at 14:49
You're missing the
& before whatever. FP x = &whatever ;– dave
Mar 28 at 14:49
1
1
@dave: That's the same for functions, you don't need the ampersand. @emma: Why should that not be possible in C++? This should work fine (except for the
(char), which should be char in your typedef)– andreee
Mar 28 at 14:52
@dave: That's the same for functions, you don't need the ampersand. @emma: Why should that not be possible in C++? This should work fine (except for the
(char), which should be char in your typedef)– andreee
Mar 28 at 14:52
add a comment |
3 Answers
3
active
oldest
votes
Whenever you can write a typedef, you can also write a variable declaration with no typedef, with almost identical syntax.
Example:
// typedef
typedef char(*FP)(unsigned);
FP x = y ;
// no typedef
char(*x)(unsigned) = y;
Remove the typedef keyword, and you have a variable declaration. Slap an initialisation on it if you want.
1
Works just as well as in C, and can also be used for array types:char (*img)[width][3] = malloc(height*sizeof(*img));While this syntax is pretty useless in C++ (no array types with runtime sizes), it works well in C and sports the same counterintuitive syntax.
– cmaster
Mar 28 at 21:09
add a comment |
You can use auto:
auto fptr = &f;
It skips the need of a typedef and conserve a nice syntax.
I like this answer a bit more than the accepted one. It is more C++11-ish even though it is not clear that OP has or wants a C++11 solution. But hey, C++11 is not the "all new exotic" standard any more.
– TobiMcNamobi
Mar 29 at 7:10
By the way, it also works without the&.
– El Profesor
yesterday
add a comment |
The code:
typedef char(*FP)(int);
FP x = y;
fails to compile with current C++ compilers if y is a lambda expression capturing a variable.
// Compiles OK
FP x0 = [](int k) -> char return char(k); ;
// Fails to compile
int i = 123;
FP x1 = [=](int k) -> char return char(k); ;
FP x2 = [=](int k) -> char return char(k+i); ;
FP x3 = [&](int k) -> char return char(k+i); ;
FP x4 = [i](int k) -> char return char(k+i); ;
// error: cannot convert ‘main()::<lambda(int)>’ to ‘FP aka char (*)(int)’
// in initialization
The reason why it fails to compile is that the size of the right side of the assignment to x1...x4 is greater than size of FP.
For a C++ compiler to make assignments to x1...x4 be valid it would need to generate code at runtime. Current C++ compilers such as GCC and clang do not support this, mainly because it would cause memory leaks because C++ isn't a garbage collected language. Some garbage collected language implementations, such as earlier versions of the official Go compiler, do support such assignments by performing runtime code generation.
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
);
);
emma brain is a new contributor. Be nice, and check out our Code of Conduct.
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%2f55400483%2fdeclare-as-function-pointer-and-initialize-in-the-same-line%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Whenever you can write a typedef, you can also write a variable declaration with no typedef, with almost identical syntax.
Example:
// typedef
typedef char(*FP)(unsigned);
FP x = y ;
// no typedef
char(*x)(unsigned) = y;
Remove the typedef keyword, and you have a variable declaration. Slap an initialisation on it if you want.
1
Works just as well as in C, and can also be used for array types:char (*img)[width][3] = malloc(height*sizeof(*img));While this syntax is pretty useless in C++ (no array types with runtime sizes), it works well in C and sports the same counterintuitive syntax.
– cmaster
Mar 28 at 21:09
add a comment |
Whenever you can write a typedef, you can also write a variable declaration with no typedef, with almost identical syntax.
Example:
// typedef
typedef char(*FP)(unsigned);
FP x = y ;
// no typedef
char(*x)(unsigned) = y;
Remove the typedef keyword, and you have a variable declaration. Slap an initialisation on it if you want.
1
Works just as well as in C, and can also be used for array types:char (*img)[width][3] = malloc(height*sizeof(*img));While this syntax is pretty useless in C++ (no array types with runtime sizes), it works well in C and sports the same counterintuitive syntax.
– cmaster
Mar 28 at 21:09
add a comment |
Whenever you can write a typedef, you can also write a variable declaration with no typedef, with almost identical syntax.
Example:
// typedef
typedef char(*FP)(unsigned);
FP x = y ;
// no typedef
char(*x)(unsigned) = y;
Remove the typedef keyword, and you have a variable declaration. Slap an initialisation on it if you want.
Whenever you can write a typedef, you can also write a variable declaration with no typedef, with almost identical syntax.
Example:
// typedef
typedef char(*FP)(unsigned);
FP x = y ;
// no typedef
char(*x)(unsigned) = y;
Remove the typedef keyword, and you have a variable declaration. Slap an initialisation on it if you want.
answered Mar 28 at 14:53
n.m.n.m.
73.8k885172
73.8k885172
1
Works just as well as in C, and can also be used for array types:char (*img)[width][3] = malloc(height*sizeof(*img));While this syntax is pretty useless in C++ (no array types with runtime sizes), it works well in C and sports the same counterintuitive syntax.
– cmaster
Mar 28 at 21:09
add a comment |
1
Works just as well as in C, and can also be used for array types:char (*img)[width][3] = malloc(height*sizeof(*img));While this syntax is pretty useless in C++ (no array types with runtime sizes), it works well in C and sports the same counterintuitive syntax.
– cmaster
Mar 28 at 21:09
1
1
Works just as well as in C, and can also be used for array types:
char (*img)[width][3] = malloc(height*sizeof(*img)); While this syntax is pretty useless in C++ (no array types with runtime sizes), it works well in C and sports the same counterintuitive syntax.– cmaster
Mar 28 at 21:09
Works just as well as in C, and can also be used for array types:
char (*img)[width][3] = malloc(height*sizeof(*img)); While this syntax is pretty useless in C++ (no array types with runtime sizes), it works well in C and sports the same counterintuitive syntax.– cmaster
Mar 28 at 21:09
add a comment |
You can use auto:
auto fptr = &f;
It skips the need of a typedef and conserve a nice syntax.
I like this answer a bit more than the accepted one. It is more C++11-ish even though it is not clear that OP has or wants a C++11 solution. But hey, C++11 is not the "all new exotic" standard any more.
– TobiMcNamobi
Mar 29 at 7:10
By the way, it also works without the&.
– El Profesor
yesterday
add a comment |
You can use auto:
auto fptr = &f;
It skips the need of a typedef and conserve a nice syntax.
I like this answer a bit more than the accepted one. It is more C++11-ish even though it is not clear that OP has or wants a C++11 solution. But hey, C++11 is not the "all new exotic" standard any more.
– TobiMcNamobi
Mar 29 at 7:10
By the way, it also works without the&.
– El Profesor
yesterday
add a comment |
You can use auto:
auto fptr = &f;
It skips the need of a typedef and conserve a nice syntax.
You can use auto:
auto fptr = &f;
It skips the need of a typedef and conserve a nice syntax.
answered Mar 28 at 15:02
Guillaume RacicotGuillaume Racicot
16.1k53771
16.1k53771
I like this answer a bit more than the accepted one. It is more C++11-ish even though it is not clear that OP has or wants a C++11 solution. But hey, C++11 is not the "all new exotic" standard any more.
– TobiMcNamobi
Mar 29 at 7:10
By the way, it also works without the&.
– El Profesor
yesterday
add a comment |
I like this answer a bit more than the accepted one. It is more C++11-ish even though it is not clear that OP has or wants a C++11 solution. But hey, C++11 is not the "all new exotic" standard any more.
– TobiMcNamobi
Mar 29 at 7:10
By the way, it also works without the&.
– El Profesor
yesterday
I like this answer a bit more than the accepted one. It is more C++11-ish even though it is not clear that OP has or wants a C++11 solution. But hey, C++11 is not the "all new exotic" standard any more.
– TobiMcNamobi
Mar 29 at 7:10
I like this answer a bit more than the accepted one. It is more C++11-ish even though it is not clear that OP has or wants a C++11 solution. But hey, C++11 is not the "all new exotic" standard any more.
– TobiMcNamobi
Mar 29 at 7:10
By the way, it also works without the
&.– El Profesor
yesterday
By the way, it also works without the
&.– El Profesor
yesterday
add a comment |
The code:
typedef char(*FP)(int);
FP x = y;
fails to compile with current C++ compilers if y is a lambda expression capturing a variable.
// Compiles OK
FP x0 = [](int k) -> char return char(k); ;
// Fails to compile
int i = 123;
FP x1 = [=](int k) -> char return char(k); ;
FP x2 = [=](int k) -> char return char(k+i); ;
FP x3 = [&](int k) -> char return char(k+i); ;
FP x4 = [i](int k) -> char return char(k+i); ;
// error: cannot convert ‘main()::<lambda(int)>’ to ‘FP aka char (*)(int)’
// in initialization
The reason why it fails to compile is that the size of the right side of the assignment to x1...x4 is greater than size of FP.
For a C++ compiler to make assignments to x1...x4 be valid it would need to generate code at runtime. Current C++ compilers such as GCC and clang do not support this, mainly because it would cause memory leaks because C++ isn't a garbage collected language. Some garbage collected language implementations, such as earlier versions of the official Go compiler, do support such assignments by performing runtime code generation.
add a comment |
The code:
typedef char(*FP)(int);
FP x = y;
fails to compile with current C++ compilers if y is a lambda expression capturing a variable.
// Compiles OK
FP x0 = [](int k) -> char return char(k); ;
// Fails to compile
int i = 123;
FP x1 = [=](int k) -> char return char(k); ;
FP x2 = [=](int k) -> char return char(k+i); ;
FP x3 = [&](int k) -> char return char(k+i); ;
FP x4 = [i](int k) -> char return char(k+i); ;
// error: cannot convert ‘main()::<lambda(int)>’ to ‘FP aka char (*)(int)’
// in initialization
The reason why it fails to compile is that the size of the right side of the assignment to x1...x4 is greater than size of FP.
For a C++ compiler to make assignments to x1...x4 be valid it would need to generate code at runtime. Current C++ compilers such as GCC and clang do not support this, mainly because it would cause memory leaks because C++ isn't a garbage collected language. Some garbage collected language implementations, such as earlier versions of the official Go compiler, do support such assignments by performing runtime code generation.
add a comment |
The code:
typedef char(*FP)(int);
FP x = y;
fails to compile with current C++ compilers if y is a lambda expression capturing a variable.
// Compiles OK
FP x0 = [](int k) -> char return char(k); ;
// Fails to compile
int i = 123;
FP x1 = [=](int k) -> char return char(k); ;
FP x2 = [=](int k) -> char return char(k+i); ;
FP x3 = [&](int k) -> char return char(k+i); ;
FP x4 = [i](int k) -> char return char(k+i); ;
// error: cannot convert ‘main()::<lambda(int)>’ to ‘FP aka char (*)(int)’
// in initialization
The reason why it fails to compile is that the size of the right side of the assignment to x1...x4 is greater than size of FP.
For a C++ compiler to make assignments to x1...x4 be valid it would need to generate code at runtime. Current C++ compilers such as GCC and clang do not support this, mainly because it would cause memory leaks because C++ isn't a garbage collected language. Some garbage collected language implementations, such as earlier versions of the official Go compiler, do support such assignments by performing runtime code generation.
The code:
typedef char(*FP)(int);
FP x = y;
fails to compile with current C++ compilers if y is a lambda expression capturing a variable.
// Compiles OK
FP x0 = [](int k) -> char return char(k); ;
// Fails to compile
int i = 123;
FP x1 = [=](int k) -> char return char(k); ;
FP x2 = [=](int k) -> char return char(k+i); ;
FP x3 = [&](int k) -> char return char(k+i); ;
FP x4 = [i](int k) -> char return char(k+i); ;
// error: cannot convert ‘main()::<lambda(int)>’ to ‘FP aka char (*)(int)’
// in initialization
The reason why it fails to compile is that the size of the right side of the assignment to x1...x4 is greater than size of FP.
For a C++ compiler to make assignments to x1...x4 be valid it would need to generate code at runtime. Current C++ compilers such as GCC and clang do not support this, mainly because it would cause memory leaks because C++ isn't a garbage collected language. Some garbage collected language implementations, such as earlier versions of the official Go compiler, do support such assignments by performing runtime code generation.
answered yesterday
atomsymbolatomsymbol
21859
21859
add a comment |
add a comment |
emma brain is a new contributor. Be nice, and check out our Code of Conduct.
emma brain is a new contributor. Be nice, and check out our Code of Conduct.
emma brain is a new contributor. Be nice, and check out our Code of Conduct.
emma brain is a new contributor. Be nice, and check out our Code of Conduct.
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.
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%2f55400483%2fdeclare-as-function-pointer-and-initialize-in-the-same-line%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
5
You could always stick with
auto x = &the_function;'.– François Andrieux
Mar 28 at 14:48
1
The name of a function pointer variable appears between the return type and the arguments It won't look like
type name = value;.– François Andrieux
Mar 28 at 14:48
You're missing the
&beforewhatever.FP x = &whatever ;– dave
Mar 28 at 14:49
1
@dave: That's the same for functions, you don't need the ampersand. @emma: Why should that not be possible in C++? This should work fine (except for the
(char), which should becharin yourtypedef)– andreee
Mar 28 at 14:52