我是编程中的菜鸟。 我的老师编写了一个没有任何预处理器指令的程序,它执行并显示输出。 这只是一个问候世界的计划。 我很困惑,如果没有指令它如何能够执行“printf”功能。
答案 0 :(得分:3)
在“经典”ANSI C(C89 / 90)中,只要您注意提供正确类型的参数,就可以在不预先声明它们的情况下调用非可变函数。因此,如果一个人正确地完成所有事情,就可以编写一个正式有效的C89 / 90程序,该程序不包含任何标准头文件。 E.g。
Cliver::Dependency::NotFound:
Could not find an executable ["phantomjs"] on your path.
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/cliver-0.3.2/lib/cliver/dependency.rb:143:in `raise_not_found!'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/cliver-0.3.2/lib/cliver/dependency.rb:116:in `detect!'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/cliver-0.3.2/lib/cliver.rb:24:in `detect!'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.9.0/lib/capybara/poltergeist/client.rb:36:in `initialize'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.9.0/lib/capybara/poltergeist/client.rb:14:in `new'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.9.0/lib/capybara/poltergeist/client.rb:14:in `start'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.9.0/lib/capybara/poltergeist/driver.rb:42:in `client'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.9.0/lib/capybara/poltergeist/driver.rb:25:in `browser'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.9.0/lib/capybara/poltergeist/driver.rb:95:in `visit'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/capybara-2.4.4/lib/capybara/session.rb:227:in `visit'
# /home/resrev/.rvm/gems/ruby-2.3.1/gems/capybara-2.4.4/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
# ./spec/scraypa_spec.rb:52:in `block (4 levels) in <top (required)>'
在现代C中,这是不可能的,因为从C99开始,所有函数都必须在被调用之前声明。
现在,即使在C89 / 90中,调用int main()
{
puts("Hello World");
return 0;
}
而不预先声明它(使用原型)也会导致未定义的行为,因为printf
是一个可变函数。所以,如果你的老师做了类似的事情
printf
然后他/她仍然需要了解很多关于C.这个C89 / 90程序无效,即使它编译,执行并显示“看起来很好”的输出。
但是,您仍然可以手动预先声明该功能
int main()
{
printf("Hello World\n");
return 0;
}
并最终获得一个不使用任何预处理指令的有效C89 / 90程序。这样做不是一个好的编程习惯。