Mat*_*son 4 c++ function-calls void
void func() {assert(0);}
int main () {void func();}
Run Code Online (Sandbox Code Playgroud)
上面的代码不调用func(),或者至少没有达到断言.不是我真的需要知道,但我只是好奇,这里发生了什么?
Set*_*gie 10
你正在声明一个名为的函数的原型,func它返回任何内容并且不带参数.这是(一个)函数调用和函数原型之间的细微差别.请注意,上面的行main,void func() {assert(0);}对于这是原型还是调用没有影响.你可以删除它,代码会做同样的事情 - 也就是说,没有.
这也告诉您可以重新声明函数原型.你甚至可以这样:
int main() {
void blah();
void blah();
void blah();
void blah();
}
Run Code Online (Sandbox Code Playgroud)
代码仍然可以做它以前做过的事 - 没有.
如果你离开void,它会调用该函数.
另外,请注意,在带参数的函数的情况下,这个:
int main() { func(4); }
Run Code Online (Sandbox Code Playgroud)
如果您void在此之前添加,则不会变成原型:
int main() { void func(4); }
Run Code Online (Sandbox Code Playgroud)
它只会产生语法错误.
正如其他人所指出的那样
void func();
Run Code Online (Sandbox Code Playgroud)
内部main被视为函数原型,而不是对函数的调用func.在C和C++中,如果您愿意,可以在函数内部声明函数原型,尽管在实践中很少这样做.
这是合法的事实会给程序员带来各种麻烦.例如,如果您将代码重写为
(void) func();
Run Code Online (Sandbox Code Playgroud)
然后,这将编译为调用func其返回类型显式转换void为表示"我不关心此返回值".换句话说,这组括号将声明更改为语句.
在C++中,这个问题可能因以下代码是函数原型而不是调用默认构造函数的变量声明而变得复杂:
Object myObject();
Run Code Online (Sandbox Code Playgroud)
虽然
Object myObject(137);
Run Code Online (Sandbox Code Playgroud)
确实创建了对象并将137传递给它的构造函数,并且
Object myObject;
Run Code Online (Sandbox Code Playgroud)
在不调用构造函数的情况下创建对象.
在调用其构造函数时尝试声明对象时,会出现一种称为"最令人烦恼的解析"的语言边缘情况.例如,这段代码是合法的C++,但它是一个函数声明而不是一个变量声明:
set<int> mySet(istream_iterator<int>(cin), istream_iterator<int>());
Run Code Online (Sandbox Code Playgroud)
问题是,这可以解析为函数声明,而不是创建一个接受两个临时istream_iterator<int>s作为参数的对象.要解决这个问题,在C++中你必须写
set<int> mySet(istream_iterator<int>(cin), (istream_iterator<int>()));
Run Code Online (Sandbox Code Playgroud)
如上所述,额外括号强制将语句从函数原型消除歧义为声明.
希望这可以帮助!