我正在Linux机器上学习C ++。我只是尝试使用“ int i();”来声明一个函数,但是却忘记了对其进行定义。但是令我惊讶的是,该代码可以编译并输出1.我感到非常困惑。我尝试了“ int I {};”,它仍然编译没有错误。请帮忙解释。预先感谢。
//test1.cpp
#include <iostream>
int main(void)
{
int i{};
std::cout << i << std::endl;
return 0;
}
g++ test1.cpp
./a.out
Output is: 0
//test2.cpp
#include <iostream>
int main(void)
{
int i();
std::cout << i << std::endl;
return 0;
}
g++ test2.cpp
./a.out
Output is : 1
答案 0 :(得分:3)
在第一个示例中,您定义了一个名为Enemy[] enemies1 = { new Enemy( "Weak Skeleton:", 100, 0, 100 ),
new Enemy( "Blue Slime:", 50, 0, 25 ),
new Enemy( "Novice Rogue Mage:", 25, 100, 0 ) };
的变量,并将其值初始化,对于i
来说,它意味着零初始化。
int
在第二个示例中,您声明一个名为int i{}; // defines i, initialised to zero
的函数,该函数不带任何参数,然后返回i
:
int
打印时:
int i(); // declares a function
std::cout << i << std::endl;
首先被转换为i
({{1}衰减为函数non-nullptr指针,然后变为bool
),然后打印为整数,即为什么得到i
。编译器可以在没有定义true
的情况下进行此转换(结果始终为1
),这就是为什么没有链接器错误的原因。
如果您打算调用此函数并打印结果,则需要使用i
:
true
这当然需要i()
的定义。
答案 1 :(得分:1)
在您的代码中:
//test1.cpp #include <iostream> int main(void) { int i{}; std::cout << i << std::endl; return 0; }
您实际上并没有定义函数就没有声明它。 int i{};
main()
中的代码行function
是variable
type
中的int
,名为i
,您正在使用brace initializer list
初始化变量i
,不带任何值,在大多数情况下可以为0
,但可以因compiler
而异。
//test2.cpp #include <iostream> int main(void) { int i(); std::cout << i << std::endl; return 0; }
在这种情况下,基本上是同一件事。您处于main()
之内,并且受"you can not declare-define a function within a function"
语言的限制,因此这将导致declaration - definition
中的variable
。唯一的区别是您没有使用brace initializer list
ctor
,这里使用的是值初始化。同样,您没有向其传递任何值,而是为您分配了任意值constructor
。
现在,如果您的代码如下所示:
1
由于#include <iostream>
int i();
int main() {
std::cout << i() << '\n';
return 0;
}
function
是i
而不是declared
,因此无法编译。但是,如果您这样做:
defined
因为#include <iostream>
// The text in quotes is not meant to be a string literal. It
// is the message of the text that represents any integer X.
int i() { return /*"some int value"*/ 1; }
int main() {
std::cout << i() << '\n';
return 0;
}
function
既是i
又是declared
,所以可以编译并运行得很好。