标签: function-declaration

应该int a,f(){}编译?

对于一个错字,我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 variable-declaration function-declaration

5
推荐指数
1
解决办法
193
查看次数

尾随返回类型函数语法中的 auto 关键字背后是否有意图?

在 C++11 中,这两行是等价的。从我看来,第二种语法优点是返回类型在类范围内。因此,您可以直接使用类的嵌套类型和decltype非静态成员的表达式。此外,函数名称排列得很好。

int foo(int bar);
auto foo(int bar) -> int;
Run Code Online (Sandbox Code Playgroud)

auto这里使用的关键字,它也可以用来自动地得到局部变量的类型。但是,我没有看到这里的类比。在函数声明语法中,没有派生任何东西。箭头后面明确提到了返回类型。

就个人而言,我会说没有auto关键字语法会更清晰。这背后有什么意图吗?哪一个?

c++ syntax function-declaration c++11 trailing-return-type

5
推荐指数
1
解决办法
361
查看次数

函数没有在C中指定的返回类型

我在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)

我想知道函数"修井"的声明是如何有效的?当我们没有提到函数的返回类型时会发生什么?(我们可以返回任何内容吗?).参数也只是一个变量名,这是如何工作的?

c function-declaration

5
推荐指数
1
解决办法
1万
查看次数

Python 3 函数声明中的“-&gt;”是什么意思?

->最近,我在学习函数声明时在 Python 3 中遇到了这个问题。这是什么意思?到目前为止,除了 Javascript 函数声明之外,我还从未见过这样的声明。

def f(self, s: 'str') -> 'bool':
    pass
Run Code Online (Sandbox Code Playgroud)

python function-declaration python-3.x

5
推荐指数
1
解决办法
1万
查看次数

如何声明函数指针参数

这两个声明有什么区别:

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

5
推荐指数
1
解决办法
78
查看次数

具有 0 个参数的函数 - void vs void*?

我知道你可以像这样声明一个没有任何参数的函数:

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)

我的问题是: usingvoidvoid*here 有什么区别?

c++ syntax void function-declaration function-definition

5
推荐指数
2
解决办法
240
查看次数

为什么对 C 函数的无效使用可以正常编译而没有任何警告?

与 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仍未初始化。

c function-call function-declaration function-definition

5
推荐指数
1
解决办法
596
查看次数

C是否支持可选的null参数?

在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

4
推荐指数
2
解决办法
2万
查看次数

为什么要为命名变量分配函数声明?

编辑:它不是对命名变量的函数声明的赋值 - 检查接受的答案.保留标题,因为其他人可能会犯同样的错误.


在阅读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)

javascript function function-declaration

4
推荐指数
2
解决办法
92
查看次数

最烦恼的解析:为什么不是`g((f()));`调用`f`的默认构造函数并将结果传递给带有`f`的`g`的ctor?

这不是最烦恼的解析:为什么不是A(()); 工作?,它基于一种形式的解析A a(());,其OP思想能够默认 - A使用额外的括号组构造一个对象.

相比之下,我的问题是关于2个类,f并且g,其中f有一个默认构造函数,而gctor需要一个f.我想g用临时f参数调用ctor ,所有这些都不使用统一的初始化语法.std::coutgctor中有一个语句,因此缺少输出表示函数声明而不是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

4
推荐指数
1
解决办法
162
查看次数