我是C语言的初学者.任何人都可以使用示例详细解释main(),int main(),void main(),main(void),void main(void),int main(void)如何在C语言中工作?正如在我们使用void main()时所发生的事情以及当我在简单语言中使用int main()时发生的事情等等.
我知道,但无法理解它在做什么:
当我使用int main()返回0编写简单的hello world时,它仍然给出与使用void main()时相同的输出,那么它是如何工作的?它的应用是什么?
如何在SDL2.0中使用像素绘制?
我正在尝试熟悉C++,但如果没有漂亮的图片,这很难做到,所以我试图让一个非常基本的图形显示器运行.我真正想做的就是给我一个窗口,让我在其上绘制rgbα像素,并访问有关这些像素的信息.我可能还有其他我不想要的东西,但现在就在我的名单上.我对此的研究使我尝试使用SDL,当前版本为2.0.
几乎所有的图形体验都来自于使用JavaScript <canvas>.大多数其他位的是来自我的计算器,它有这个真的真棒Pxl-On()命令,那么容易.
我正在使用MinGW作为我的C++,如果重要的话.此外,如果有更好的东西比SDL2.0更适合我需要的东西,建议欢迎.
**"更好"意味着"包含我需要的功能,但总功能少于SDL2.0,和/或具有比SDL2.0更直观/更简单的***API."
***减少完成相同任务的代码行.
这是C++程序:
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int test_string(const string & str) {
return str.size();
}
void main() {
test_string(""); //can compile
vector<string> v;
string sum = accumulate(v.cbegin(), v.cend(), ""); //cannot compile
}
Run Code Online (Sandbox Code Playgroud)
我想使用隐式转换,从const char *以string仿制STL函数的调用accumulate.我知道转换const char *为字符串不是显式的,因此我们可以将const char *参数传递给需要string类型的调用.这可以通过上述test_string功能证明.但当我做同样的事情时accumulate,编译器抱怨:
Run Code Online (Sandbox Code Playgroud)error C2440: '=': cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *'
代码工作只有当我更换""使用string("").我不明白为什么隐式转换适用于我的自定义函数但不起作用accumulate.你能解释一下吗?非常感谢.
PS:我正在使用Visual Studio 2015.
为什么,如果我写
int main()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
return 0;在main功能结束时我不需要写吗?编译器是否为我做了?
我用的是GCC/C99.
可能重复:
主要的正确声明是什么?
这个main函数中的参数是什么意思?他们想告诉我们什么?
int main(int argc, char** argv)
更新:并且,前面的代码行是否类似于此int main(int argc, char* argv[])?如果是这样,我们怎么能说char** argv类似char* argv[],因为他们不看从类似阵列的观点?
如何与int main()没有任何论据进行比较?
谢谢.
我们可以在Unix编译器中使用wmain()函数,还是只在\ for windows上使用?
什么是虚空?有人提供一些例子,正确使用虚空吗?当我们写void main (void)或有main()什么区别?
我一直认为这argc是标志结束的必要条件,argv但我只是argv[argc] == NULL按照定义学到了这一点.我认为这argc完全是多余的吗?如果是这样,我一直认为C以效率的名义取消冗余.我的假设是错误的还是背后的历史原因?如果原因是历史性的,你能详细说明吗?
Stephen Prata在他的着作C++ Primer Plus [p 31]中说:
许多现有程序使用经典的C函数头代码:
main() // original C style
在经典C下,省略返回类型与声明函数类型为int相同.但是,C++已逐步淘汰了这种用法.
但是C++ 11草案3.6.1-> 2说
实现不应预定义主函数.此功能不应过载.它应该具有int类型的返回类型,否则其类型是实现定义的.
测试结果
$ g++ -Werror=pedantic MainCheck.cpp -o MainCheck
MainCheck.cpp:3:6: error: ISO C++ forbids declaration of ‘main’ with no type [-Werror=pedantic]
main()
$ # also means g++ don't conform to the standard
Run Code Online (Sandbox Code Playgroud)
确认普拉塔先生在C++标准方面所说的是正确的.
C++ 11草案中是否有一个条款不鼓励使用:
main() // that is without return type.
Run Code Online (Sandbox Code Playgroud)
是
它的返回类型应为int类型
本身这样一个条款?
C标准说:
程序启动时调用的函数名为main.该实现声明此函数没有原型.它应该使用int的返回类型定义,并且没有参数:
Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):
Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }或等效的或以某种其他实现定义的方式.
但是,Kernighan&Ritchie在他们的第二版(规范的ANSI C)圣经中使用:
main()
{
/* taram pampam ... */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谁是对的?它是否与函数没有返回值自动假设int在C中返回?