为了在C程序中获取环境变量,可以使用以下内容:
getenv() extern char **environ;但除了上面提到的,使用char *envp[]第三个参数main()来获取环境变量被认为是标准的一部分?
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
while(*envp)
printf("%s\n",*envp++);
}
Run Code Online (Sandbox Code Playgroud)
是char *envp[]便携式?
C中主要功能的有效签名究竟是什么?我知道:
int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)
还有其他有效的吗?
我在CodeGolf上看到了一段代码,它的目的是作为编译器炸弹,其中main声明为一个巨大的数组.我试过以下(非炸弹)版本:
int main[1] = { 0 };
Run Code Online (Sandbox Code Playgroud)
它似乎在Clang下编译得很好,并且在GCC下只有一个警告:
警告:'main'通常是一个函数[-Wmain]
结果二进制文件当然是垃圾.
但为什么它会编译呢?是否允许C规范?我认为相关的部分说:
5.1.2.2.1程序启动
程序启动时调用的函数名为main.该实现声明此函数没有原型.它应定义为返回类型为int且没有参数[...]或具有两个参数[...]或以某种其他实现定义的方式.
"其他一些实现定义的方式"是否包含全局数组?(在我看来,规范仍然指的是一个函数.)
如果没有,它是编译器扩展吗?或者工具链的一个功能,它可以用于其他目的,他们决定通过前端提供它?
以下是什么意思:
int main(void) {...}
Run Code Online (Sandbox Code Playgroud)
VS
int main() {...}
Run Code Online (Sandbox Code Playgroud)
?
我认为这int main() {...}意味着main不接收任何参数(来自命令行),但是:
int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)
确实.
但这int main(void) {...} 意味着什么?什么是无效主张?
我看过这里,但这是一个不同的问题.
(我正在使用Visual C++ 2008)我总是听说main()需要返回一个整数,但是这里我没有放入return 0;并且它编译时出现0错误和0警告!在调试窗口中,它表示程序已经退出代码0.如果此函数被命名为main()以外的任何东西,编译器会抱怨说'blah'必须返回一个值.粘贴a return;也会导致错误出现.但完全不考虑它,它编译得很好.
#include <iostream>
using namespace std;
int main()
{
cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}
Run Code Online (Sandbox Code Playgroud)
这可能是VC++中的一个错误吗?
在C中,我知道int main()返回一个int,其中void main()没有.除此之外,他们之间有区别吗?第一个好于第二个?
如果是,在哪个操作系统,shell或其他什么?
考虑下面的java程序(我只是以java为例,任何语言对这个问题都有好处,更多的是关于操作系统):
public class ExitCode {
public static void main(String args[]) {
System.exit(Integer.parseInt(args[0]));
}
}
Run Code Online (Sandbox Code Playgroud)
在Linux和bash上运行它,它总是返回不等于255的值,例如(echo $?打印上一个执行命令的退出代码)
> java ExitCode 2; echo $?
2
> java ExitCode 128; echo $?
128
> java ExitCode 255; echo $?
255
> java ExitCode 256; echo $?
0
> java ExitCode 65536; echo $?
0
Run Code Online (Sandbox Code Playgroud)
编辑:下面的(只有,到目前为止)答案完全解释了在UNIX上发生的事情.我仍然想知道其他操作系统.
人们用 void main() /*empty parens ()*/
我被教过要写 void main(void)
任何想法有什么区别?
正如预期的那样,C++ 11中的以下内容失败,因为该语言没有bog标准函数的返回类型推导:
auto main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,C++ 14确实如此,所以我无法解释以下错误(在GCC trunk,clang 3.8和Visual Studio 2015中具有相同的结果):
error: 'main' must return 'int'
Run Code Online (Sandbox Code Playgroud)
我没有看到标准中的一个段落,禁止返回类型扣除main?或者两个编译器都不兼容?
(对于它的价值,我永远不会真的这样做.int main()为了胜利......)