我想用cout打印出一个函数指针,发现它不起作用.但是在将函数指针转换为(void*)之后它才起作用,printf与%p一样,例如
#include <iostream>
using namespace std;
int foo() {return 0;}
int main()
{
int (*pf)();
pf = foo;
cout << "cout << pf is " << pf << endl;
cout << "cout << (void *)pf is " << (void *)pf << endl;
printf("printf(\"%%p\", pf) is %p\n", pf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用g ++编译它并获得如下结果:
cout << pf是1
cout <<(void*)pf是0x100000b0c
printf("%p",pf)是0x100000b0c
那么cout对int(*)()类型做了什么?我被告知函数指针被视为bool,是真的吗?cout用type(void*)做什么?
提前致谢.
编辑:无论如何,我们可以通过将函数指针转换为(void*)并使用cout将其打印出来来观察函数指针的内容.但它对成员函数指针不起作用,编译器抱怨非法转换.我知道成员函数指针是一个比简单指针更复杂的结构,但是我们如何才能观察成员函数指针的内容呢?
#include <iostream>
int main(){
std::cout << main << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么在命令行中打印1?
我正在阅读"C++编程语言 - 第四版",我正在打一个简单的练习,只是为了获得C++语法,我不小心偶然发现了让我挑眉的东西.总之,我忘了补充()上accept主:
bool accept()
{
cout << "Do you want to proceed (y or n)?\n";
char answer = 0;
cin >> answer;
if (answer == 'y')
{
return true;
}
return false;
}
int main()
{
accept;
}
Run Code Online (Sandbox Code Playgroud)
这运行并编译并生成(在VS2015中)a
C4551 - 函数调用缺少参数列表
我发现自己在阅读lambda和一些关于SO的问题应该被关闭,因为他们主要是要求"调试我的代码".
我想如果代码编译并运行,并且该函数包含一个阻塞语句(等待用户输入)和一个返回类型,那么所有代码都将按预期执行,而不管是否遗漏了括号; 但事实并非如此.
另外,我想我会将调用更改为acceptmain,以bool a = accept; cout << a;尝试阻止任何优化(如果那是实际发生的事情),并且也没有调用accept()代码.
我很想知道的是:
accept要编译成什么叫?accept调用代码bool a = accept; cout << a;在main中运行代码生成 …当我试图弄清楚下面代码发生了什么时,我得出了这个结论:
#include <iostream>
int main()
{
std::cout << (div) << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
div上述可以与被取代printf,atoi,difftime等不论是否我#include荷兰国际集团的适当的报头(ctime,time.h,cstdlib,...,),我得到没有编译器错误和节目被打印1.当我用函数名称作为前缀时,程序没有编译std::.
Clang警告解释了发生了什么:
warning: address of function 'div' will always evaluate to 'true' [-Wbool-conversion]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
#included ,C库函数的名称也没有任何意义?std?我在编程时忘记了函数调用后忘记括号,但是我只收到警告,我忽略了:
main.cpp:7:15: warning: expression result unused [-Wunused-value]
if (i == 0) clearDisplay;
^~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
刚做的时候也会发生同样的事情
int i = 0;
i;
Run Code Online (Sandbox Code Playgroud)
为什么这不是编译器错误?
#include <iostream>
void clearDisplay(void);
int main(void){
for(int i = 0; i < 2; i++){
if (i == 0) clearDisplay;
}
}
void clearDisplay(void){
std::cout << "test" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编辑:与没有括号的g ++"调用"函数相反(不是f()而是f;).为什么总是返回1?我不问为什么它被隐式浇铸为数字,但为什么像它确实编译器不提醒我关于if(i=0)到if(i==0)
考虑这个简单的程序:
#include <iostream>
void length(void){
std::cout<<"My length is void"<<std::endl;
}
void width(void){
std::cout<<"My width is void"<<std::endl;
}
int main(void){
std::cout<<"The program length is: "<<length<<std::endl;
std::cout<<"The program width is: "<<width<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是:
The program length is: 1
The program width is: 1
Run Code Online (Sandbox Code Playgroud)
程序打印出来的数字是多少,基本上没有多少C++知识,这对我来说看起来更加pythonic语法,看起来好像应该打印函数地址.我这样说是因为这个问题最初是在为openGL练习一些非常基本的程序时出现的,
回调是在GLUT中注册的,例如:
void line(void){
//some code for line program ...
}
int main(int argc, char** argv){
//some more code;
glutDisplayFunc(line);
glutMainLoop();
}
Run Code Online (Sandbox Code Playgroud)
这几乎看起来好像我们正在传递函数的地址,但是,从上面的程序中可以清楚地知道这不是一个地址,指向函数的语法有点不同,如果是这样,这个函数如何被注册为打回来?我们传递的是 glutDisplayFunc什么?
并且,因为我想要注册一个已经传递参数的函数,我搜索python lambda函数的C++类比,并找到类似的lambda函数,但它没有成功:**
#include <iostream>
void line(int a, int b){
//some code that does …Run Code Online (Sandbox Code Playgroud)