考虑这两个函数定义:
void foo() { }
void foo(void) { }
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?
我不明白为什么这段代码会编译?
#include <stdio.h>
void foo() {
printf("Hello\n");
}
int main() {
const char *str = "bar";
foo(str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc甚至没有发出警告,我向foo()传递了太多的参数.这是预期的行为吗?
我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:
int f(void)
Run Code Online (Sandbox Code Playgroud)
我倾向于写作:
int f()
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:
virtual int f(void)
Run Code Online (Sandbox Code Playgroud)
派生类包括成员函数:
int f()
Run Code Online (Sandbox Code Playgroud)
这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?
void func()
实际上,空参数表示接受任何参数.
void func(void) 不接受任何争论.
但在标准C99中,我找到了这样的界限:
6.7.5.3函数声明
符(包括原型) 14标识符列表仅声明函数参数的标识符.函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数.函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或类型的信息.
根据标准,func()并且func(void)是相同的?
以下是什么意思:
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) {...} 意味着什么?什么是无效主张?
我看过这里,但这是一个不同的问题.
将空隙放入params的原因是什么?
为什么不把它留空?
void createLevel(void);
void createLevel();
Run Code Online (Sandbox Code Playgroud) 我想拿起一点x86.我正在使用gcc -S -O0在64位mac上进行编译.
C中的代码:
printf("%d", 1);
Run Code Online (Sandbox Code Playgroud)
输出:
movl $1, %esi
leaq LC0(%rip), %rdi
movl $0, %eax ; WHY?
call _printf
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在调用'printf'之前%eax被清除为0.由于printf返回打印的字符数量为%eax我最好的猜测,因此将其归零以准备它,printf但我认为printf必须负责准备它.而且,相反,如果我调用自己的功能int testproc(int p1),则gcc认为没有必要准备%eax.所以我想知道为什么gcc对待printf和testproc不同.
这是我第一次在这里发帖,希望我做得对.
基本上我需要帮助试图找出我用C编写的一些代码.程序的目的是要求用户输入0到23之间的数字.然后,根据用户输入的数字,半金字塔将打印(就像旧学校马里奥游戏中的那些).我是编程的初学者,仅凭运气就得到了我的代码的答案,但现在我无法确定我的for循环如何提供金字塔形象.
#include <stdio.h>
int main ( void )
{
int user_i;
printf ( "Hello there and welcome to the pyramid creator program\n" );
printf ( "Please enter a non negative INTEGER from 0 to 23\n" );
scanf ( "%d", &user_i );
while ( user_i < 0 || user_i > 23 )
{
scanf ( "%d", &user_i );
}
for ( int tall = 0; tall < user_i; tall++ )
{
// this are the two for loops that happened …Run Code Online (Sandbox Code Playgroud) 我想知道为什么这会编译:
int test();
int main() { return test((void*)0x1234); }
int test(void* data) { return 0; }
Run Code Online (Sandbox Code Playgroud)
为什么编译器不会发出任何错误/警告(我试过clang,gcc)?如果我更改返回值它将无法编译 - 但参数可能不同?!
当C函数不接受任何参数时,是否必须通过语言规则使用"void"参数声明/定义它?当参数列表中没有任何内容时,PC-Lint似乎有问题,我想知道它是否是我不知道的语言语法中的东西.
编辑:我刚发现一个重复的(后面的傻瓜?它首先出现)问题,C void参数,它有更多的答案和解释.