对于一个错字,我a留在那里.当我去编译时,编译器报告:
'a'和'f'的声明之间缺少','
码:
int a
f(void)
{
}
Run Code Online (Sandbox Code Playgroud)
因为我从来没有得到任何这样的错误信息,而且我不知道我可以在那里放一个逗号并且它编译得很好(在我测试的多个编译器中),这是非常令人惊讶的:
int a,
f(void)
{
}
Run Code Online (Sandbox Code Playgroud)
但当然这不是我的意图,而是int f(void){}代替.我尝试了另一个编译器,但它没有用,并报告了这样的语法错误(在clang中):
错误:预期';' 在顶级声明者之后.
我的问题是:哪一个是正确的?它应该或不应该编译?标准对这种行为有什么看法?
我不打算使用它,因为把变量和函数分成逗号有点难看(就像它是函数原型一样).我只是好奇.
编辑:添加void在函数参数中.其实我想用空参数写一个函数
在 C++11 中,这两行是等价的。从我看来,第二种语法的优点是返回类型在类范围内。因此,您可以直接使用类的嵌套类型和decltype非静态成员的表达式。此外,函数名称排列得很好。
int foo(int bar);
auto foo(int bar) -> int;
Run Code Online (Sandbox Code Playgroud)
在auto这里使用的关键字,它也可以用来自动地得到局部变量的类型。但是,我没有看到这里的类比。在函数声明语法中,没有派生任何东西。箭头后面明确提到了返回类型。
就个人而言,我会说没有auto关键字语法会更清晰。这背后有什么意图吗?哪一个?
我在C中遇到了这段代码:
#include <stdio.h>
main( )
{
int i = 5;
workover(i);
printf("%d",i);
}
workover(i)
int i;
{
i = i*i;
return(i);
}
Run Code Online (Sandbox Code Playgroud)
我想知道函数"修井"的声明是如何有效的?当我们没有提到函数的返回类型时会发生什么?(我们可以返回任何内容吗?).参数也只是一个变量名,这是如何工作的?
->最近,我在学习函数声明时在 Python 3 中遇到了这个问题。这是什么意思?到目前为止,除了 Javascript 函数声明之外,我还从未见过这样的声明。
def f(self, s: 'str') -> 'bool':
pass
Run Code Online (Sandbox Code Playgroud) 这两个声明有什么区别:
double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));
Run Code Online (Sandbox Code Playgroud)
它们似乎都在 GCC 中使用相同的调用:
math_operation(2.0, sqrt);
Run Code Online (Sandbox Code Playgroud)
它只是语法糖还是更多?
c function-pointers implicit-conversion function-declaration
我知道你可以像这样声明一个没有任何参数的函数:
void test()
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
但我也见过
void test(void)
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
和
void test(void*)
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是: usingvoid和void*here 有什么区别?
与 C 相比,我更喜欢 C++,但这个简单的代码示例让我大吃一惊:
int foo() {
return 3;
}
int main() {
int x;
foo(&x);
return x;
}
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/4ov9nTzjM
没有警告,没有链接问题,但此代码仍然无效。
当一些初学者用具有这个奇怪问题的代码提出问题时,我偶然发现了这一点。有人在其他网站(非英语网站)上提出了问题,我想向他提供更好的解释为什么它可以编译(并了解一些有关 C 的知识)。如果有人需要的话,他的原始代码。
我怀疑这个sis在某种程度上与隐式函数声明有关,但我不完全确定。为什么编译器不会抱怨foo使用参数调用?
这是一个程序集:
foo:
push rbp
mov rbp, rsp
mov eax, 3
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
lea rax, [rbp-4]
mov rdi, rax
mov eax, 0
call foo
mov eax, DWORD PTR [rbp-4]
leave
ret
Run Code Online (Sandbox Code Playgroud)
如您所见,x仍未初始化。
在Python中,我习惯了类似的东西
def send_command(command, modifier = None):
Run Code Online (Sandbox Code Playgroud)
然后modifier参数是可选的,并且参数的缺失可以与参数0区分开来.在C中是否有类似的功能?我没有C和Googling的经验,但是找不到如何在C中使用可选参数的明确声明.看起来你可以类似地分配它们,如下所示:
void send_command(uint8_t command, uint8_t modifier = 0) {
Run Code Online (Sandbox Code Playgroud)
所以第二个参数是可选的,如果不使用则默认为0? (编辑:不,无论如何这是无效的C)
但功能可以区分send_command(SOMETHING)和send_command(SOMETHING, 0)?理想情况下,第二个参数可以是任何uint8值,包括0.
也许NULL与0不同?
void send_command(uint8_t command, uint8_t modifier = NULL) {
Run Code Online (Sandbox Code Playgroud) c null optional-parameters function-parameter function-declaration
编辑:它不是对命名变量的函数声明的赋值 - 检查接受的答案.保留标题,因为其他人可能会犯同样的错误.
在阅读Paul Irish的infinitescroll jquery插件代码时,我偶然发现了以下模式:
...
_create : function infscr_create (options, callback) { /* ... */ },
...
Run Code Online (Sandbox Code Playgroud)
这样做的好处是什么,而不是:
...
_create : function (options, callback) { /* ... */ },
...
Run Code Online (Sandbox Code Playgroud) 这不是最烦恼的解析:为什么不是A(()); 工作?,它基于一种形式的解析A a(());,其OP思想能够默认 - A使用额外的括号组构造一个对象.
相比之下,我的问题是关于2个类,f并且g,其中f有一个默认构造函数,而gctor需要一个f.我想g用临时f参数调用ctor ,所有这些都不使用统一的初始化语法.std::cout在gctor中有一个语句,因此缺少输出表示函数声明而不是g对象实例化.我在注释中用3个数字注释了示例代码.#1和#2编译时#3注释掉了,反之亦然:
#include <iostream>
struct f {};
struct g {
g(f) { std::cout << "g's ctor\n"; }
};
int main() {
// -----Output-----
g( f() ); // #1: function declaration; expected
g( ( f() ) ); // #2: also a function declaration; UNEXPECTED
// g myG( ( f() ) ); …Run Code Online (Sandbox Code Playgroud) c++ constructor class most-vexing-parse function-declaration
c ×5
c++ ×3
syntax ×2
c++11 ×1
class ×1
constructor ×1
function ×1
javascript ×1
null ×1
python ×1
python-3.x ×1
void ×1