标签: declaration

将函数分配给函数指针,const参数正确吗?

我现在正在我的大学学习C ++和OOP的基础知识。我不确定100%分配函数给函数指针时如何工作。我遇到了以下代码:

void mystery7(int a, const double b) { cout << "mystery7" << endl; }
const int mystery8(int a, double b) { cout << "mystery8" << endl; }

int main() {
    void(*p1)(int, double) = mystery7;            /* No error! */
    void(*p2)(int, const double) = mystery7;
    const int(*p3)(int, double) = mystery8;
    const int(*p4)(const int, double) = mystery8; /* No error! */
}
Run Code Online (Sandbox Code Playgroud)

从我的理解来看,p2p3分配很好,因为函数参数类型匹配并且const-ness是正确的。但是,为什么p1p4分配失败?将const double / int与非const double / int匹配是否不合法?

c++ parameters const declaration function-declaration

16
推荐指数
1
解决办法
881
查看次数

使用和不使用'typedef'声明枚举之间有什么区别?

在C++中声明枚举的标准方法似乎是:

enum <identifier> { <list_of_elements> };
Run Code Online (Sandbox Code Playgroud)

但是,我已经看到了一些声明,例如:

typedef enum { <list_of_elements> } <identifier>;
Run Code Online (Sandbox Code Playgroud)

如果存在,它们之间有什么区别?哪一个是正确的?

c++ enums typedef declaration

15
推荐指数
1
解决办法
2205
查看次数

目标C:如果@property似乎自动执行,我们为什么要在.h成员区域中声明ivars?

在实现接口时,似乎教程和文献中的常用方法是声明一个ivar,然后设置@propertythen @synthesize.

@interface MyClass : NSObject {
NSString *myString;
}

@property (nonatomic, retain) NSString *myString;
@end
Run Code Online (Sandbox Code Playgroud)

但是,省略显式声明并仅放置@property具有相同的效果.

@interface MyClass: NSObject {
}

@property (nonatomic, retain) NSString *myString;
@end
Run Code Online (Sandbox Code Playgroud)

那么大多数人如何使用@property和明确宣言?不好的形式不是吗?

properties declaration dynamic objective-c ivar

15
推荐指数
1
解决办法
809
查看次数

是Type name = name; 在C++中有用吗?

C++中允许使用以下代码:

int a = a;
Run Code Online (Sandbox Code Playgroud)

要么

Type name = name;
Run Code Online (Sandbox Code Playgroud)

两者都会导致未初始化的对象被自身初始化,这通常会导致未定义的行为.

这样的代码是否需要或合理?是否存在此类代码有用的情况?

c++ variables initialization declaration undefined-behavior

15
推荐指数
2
解决办法
592
查看次数

在Lua中你如何导入模块?

你用吗

require "name"
Run Code Online (Sandbox Code Playgroud)

要么

local name = require "name"
Run Code Online (Sandbox Code Playgroud)

另外,您是否明确将系统模块声明为局部变量?例如

local io = require "io"
Run Code Online (Sandbox Code Playgroud)

请解释你的选择.

Lua 2ed中的编程说"如果她更喜欢使用较短的名称来代替模块,她可以为它设置一个本地名称",而不是local m = require "mod"更快require "mod".如果没有区别,我宁愿使用清洁require "mod"声明,也不会为预加载的系统模块编写声明.

import lua module declaration require

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

Objective-C中的私有方法,在Xcode 4.3中我不再需要在我的实现文件中声明它们吗?

我头上有很多问号.我没有得到的是在xcode 4.3之前我需要在我的实现文件中声明前向声明(对于私有方法).

就像我的.m文件一样:

// deleting this with xcode 4.3 the below code still does work 
// in previous versions i had to put this because otherwise the compiler can't find methodFirst
@interface DetailViewController ()
- (void)methodFirst;
- (void)methodSecond;
@end


@implementation DetailViewController

- (void) methodSecond
{
   // if i delete the forward declaration now adays i dont get a compiler error that he cant find method first
   [self methodFirst];
}

- (void) methodFirst
{
}

@end
Run Code Online (Sandbox Code Playgroud)

现在看来我不再需要那样做了?Apple是否更新了编译器以便不再需要提交声明?

我找不到任何有关此更改的Apple官方消息来源的参考.我想知道其他人在新环境中遇到了什么.

xcode declaration objective-c forward forward-declaration

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

在C++中对for循环中的变量进行重新声明

当尝试为多个平台编译以下(简化)代码时,我发现它在某些方面失败了,即IBM的xlC_r.进一步的调查发现,它也没有在考虑和铿锵声.它使用g ++和Solaris的CC成功编译.

这是代码:

int main()
{
    int a1[1];
    bool a2[1];

    for (int *it = a1, *end = a1+1; it != end; ++it) {
        //...
        bool *jt = a2, *end = a2+1;
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

xlC_r错误:

"main.cpp", line 8.25: 1540-0400 (S) "end" has a conflicting declaration.
"main.cpp", line 6.25: 1540-0425 (I) "end" is defined on line 6 of "main.cpp".
Run Code Online (Sandbox Code Playgroud)

铿锵声:

main.cpp:8:25: error: redefinition of 'end' with a different type
        bool *jt = a2, *end = a2+1;
                        ^
main.cpp:6:25: note: previous definition …
Run Code Online (Sandbox Code Playgroud)

c++ for-loop declaration

15
推荐指数
1
解决办法
2855
查看次数

为什么Java允许类型不安全的阵列分配?

通常,Java可以被视为类型安全的语言.我知道泛型有一些缺陷,但我最近遇到了一个前所未有的问题.要打破它:

Object[] objects = new Integer[10];
objects[0] = "Hello World";
Run Code Online (Sandbox Code Playgroud)

不会导致预期的编译时错误.我会假设一个数组的声明Object将不允许指向一个其他的数组.在泛型中,我不允许做出如下奇怪的事情:

ArrayList<Object> objs = new ArrayList<Integer>
Run Code Online (Sandbox Code Playgroud)

如果我试图欺骗Java做一些事情

ArrayList<? extends Object> objects = new ArrayList<Integer>
Run Code Online (Sandbox Code Playgroud)

我被允许声明它,但我只能添加类型的对象null.

为什么Java不会阻止声明这样的weired数组呢?

java arrays runtime-error declaration type-safety

15
推荐指数
2
解决办法
2527
查看次数

声明一个无用的局部变量

所以这是一个奇怪的,我知道代码本身是相当无用的,但我想知道为什么我得到错误:

我写了一些代码,我写了这个:

if(scan.hasNextInt())
    int row = scan.nextInt();
Run Code Online (Sandbox Code Playgroud)

当时没有考虑变量范围,显然这是无用的,因为无论如何我都不能使用row过去if.我没有得到的是我收到错误的原因:

> javac hw.java
hw.java:25: '.class' expected
    int row = scan.nextInt();
        ^
hw.java:25: not a statement
    int row = scan.nextInt();
    ^    
hw.java:25: illegal start of expression
    int row = scan.nextInt();
            ^
hw.java:25: ';' expected
    int row = scan.nextInt();
                  ^
Run Code Online (Sandbox Code Playgroud)

现在,如果我只是修改它,如果检查:

if(scan.hasNextInt()) {
    int row = scan.nextInt();
}
Run Code Online (Sandbox Code Playgroud)

它会编译好.我的印象是,如果if大括号下面有1行是可选的......显然还有其他考虑,或者两者都要编译或失败.

有人可以向我解释,或者指向一个文档,解释为什么我不能在if没有大括号的条件下声明局部变量?


编辑:这是完整的功能:

public static char getinput() {
    System.out.println("Where do you want to go? (row column)");
    Scanner …
Run Code Online (Sandbox Code Playgroud)

java scope if-statement declaration local-variables

15
推荐指数
1
解决办法
407
查看次数

为什么C++在声明之前从不允许使用函数?

好的,我知道这看起来像是复制了为什么在使用之前需要声明函数?但似乎现有答案并未完全解决所有细节问题.

我知道C++最初是在80年代设计的,所以它可以在一次通过中翻译,因为计算机很慢.好.但是最新的标准是在2011年发布的,所以我不明白为什么C++编译器现在不能做需要多次传递的事情.它仍然会伤害性能,是的,但只有在它真的变得必要的时候.所以以下内容仍然只需要一次传递:

void foo();
int main() { foo(); }
void foo() {}
Run Code Online (Sandbox Code Playgroud)

而对于以下情况,编译器可以使两个(并且更慢),因为它不知道foo是函数还是类型,直到它看到下面的声明:

int main() { foo(); }
void foo() {}
Run Code Online (Sandbox Code Playgroud)

如果你试图使用一个函数而不首先声明它,并且声明根本不在当前的翻译单元中,那么这将是一个错误.但是如果它在同一个翻译单元中,那么编译器可以只进行额外的传递.

我的同事辩称,这样的功能可以节省大量的开发人员时间,并且可以避免声明和定义不匹配的问题.而且我确信这已被多次提出并且每次都被拒绝.拒绝它的实际原因是什么,委员会的理由?

c++ compiler-construction declaration c++11

14
推荐指数
1
解决办法
684
查看次数