这张便条说:
-ansi:告诉编译器实现ANSI语言选项.这会关闭GCC的某些与ANSI标准不兼容的"功能".
-pedantic:与-ansi此结合使用,这告诉编译器严格遵守ANSI标准,拒绝任何不符合的代码.
首先要做的事情:
-pedantic和-ansi选项的目的是什么(我无法理解上面的描述)?以下是什么意思:
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) {...} 意味着什么?什么是无效主张?
我看过这里,但这是一个不同的问题.
我知道 \xe2\x80\x9c函数声明符中的空列表不是该函数定义的一部分,指定不提供有关参数数量或类型的信息\xe2\x80\x9e [1]:
\n// No information about the parameters is supplied.\nint foo();\nRun Code Online (Sandbox Code Playgroud)\n我知道 \xe2\x80\x9c函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数\xe2\x80\x9e [2]。
\n// In this case the foo() function has no parameters.\nint foo()\n{\n // ...\n}\nRun Code Online (Sandbox Code Playgroud)\n我知道 \xe2\x80\x9c类型的未命名参数的特殊情况void作为列表中唯一的项目指定该函数没有参数\xe2\x80\x9e [3]:
// foo() has no parameters.\nint foo(void);\n\n// bar() has no parameters.\nint bar(void)\n{\n // ...\n};\nRun Code Online (Sandbox Code Playgroud)\n所以这里有一些问题:
\n合法吗int main() { /* ... …
下面是我的代码:
//main.c
int f()
{
static int x = 0;
x += 1;
return x;
}
int main()
{
f();
printf("%d", f());
}
Run Code Online (Sandbox Code Playgroud)
并且输出是2。
我知道静态变量会保持状态,但是由于我调用了f()两次,每次x都先设置为 0 ( static int x = 0;),然后加 1,那么1无论我调用多少次,输出都应该是f()?
我已经明确指出C99标准文件
6.7.5.3.14标识符列表仅声明函数参数的标识符.函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数.函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或类型的信息.
我从那句话中解释的是,void在函数定义中写入是多余的.我弄错了吗?