小编Pan*_*nda的帖子

Java中的等于vs Arrays.equals

在比较Java中的数组时,以下两个语句之间是否有任何区别?

array1.equals(array2);
Arrays.equals(array1, array2);
Run Code Online (Sandbox Code Playgroud)

如果是这样,他们是什么?

java arrays equality

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

编译时是否可以指定相对于用户当前目录的#include文件路径?

我知道可以指定#include相对于文件所在目录的文件路径(作为绝对文件路径),也可以指定相对于$PATH系统变量中任何目录的文件路径。编译程序时,有没有办法相对于用户的当前目录来指定它?假设我具有以下文件结构:

|--dir_a/
|  |--a.c
|  |--a.h
|--dir_b/
|  |--b.c
|  |--b.h
|--makefile
Run Code Online (Sandbox Code Playgroud)

现在,假设我要从中#include获取文件。使用的位置,可以这样写:dir_a/a.hdir_b/b.hdir_b/b.h

#include ../dir_a/a.h
Run Code Online (Sandbox Code Playgroud)

但是,在我看来,这种方法存在一个重大缺陷,因为它会对文件之间的位置进行硬编码,这意味着重新定位文件将需要更新包含该文件的所有位置的文件路径。

使用绝对文件路径可以避免此问题,但可以硬编码项目在文件系统中的位置,这似乎是一种不好的做法。

最后,使用<>标签指定文件路径也不可行,因为我无法假定该项目将在$PATH变量中列出。

因此,我想做的是能够指定相对于用户从中进行编译的路径(甚至从makefile的位置进行编译)。在上面的示例中,这将使我使用以下语句来#include dir_a/a.hfrom dir_b/b.h

#include dir_a/a.h
Run Code Online (Sandbox Code Playgroud)

我认为这将是理想的解决方案。这将使这些#include语句更加一致并且更易于遵循,并且避免了我上面列出的缺点。是否有可能以任何方式做到这一点,例如 与编译器标志或什么?我正在gcc用作编译器。

c gcc path include

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

命名python模块有哪些要求?

我一直在学习Python的艰难之路作为一种复习.而不是命名每个例子ex#.py(其中#是练习的编号),然而,我只是称他们为#.py.这个工作正常,直到我进入练习25,这需要您通过解释器导入刚刚创建的模块.当我尝试这个时,会发生以下情况:

>>> import 25
  File "<stdin>", line 1
    import 25
            ^

SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我尝试将文件重命名为ex25.py,然后按预期工作(>>> import ex25).我想知道的是python模块的命名要求是什么?我在这里查看了官方文档,但没有看到它提到任何限制.

编辑:iCodez,Pavel和BrenBarn的所有三个答案都提供了很好的资源并帮助回答了这个问题的不同方面.我最终选择iCodez的答案是正确的,因为这是第一个答案.

python module naming-conventions

3
推荐指数
1
解决办法
700
查看次数

用C++初始化抽象基类的子类数组

我在 C++ 中有一个抽象基类,需要创建一个数组来存储作为它的子类的对象。我使用指向子类的指针,因为数组的每个成员都需要具有相同的大小。目前我正在像这样声明和初始化我的数组:

BaseClass *array[];
...
array =
{
    &SubClass1(...),
    &SubClass2(...),
    ...
    &SubClass3(...)
};
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,这给了我以下信息:

warning: taking address of temporary
error: too many initializers for ‘BaseClass* [0]’
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

c++ arrays inheritance abstract-class pointers

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

为什么在 linux x86_64 (nasm) 上 write 系统调用在末尾打印 `%`?

以下 hello-world 程序%在打印字符串的末尾显示一个符号。这是为什么?我该如何删除它?

这是我的程序:

section .data
    msg db  "hello, world!"

section .text
    global _start
_start:
    mov rax, 1      ; syscall 1 (write)
    mov rdi, 1      ; arg 1 = 1 (stdout)
    mov rsi, msg    ; arg 2 = msg ("hello, world!")
    mov rdx, 13     ; arg 3 = 13 (char count)
    syscall         ; call write
    mov rax, 60     ; syscall 60 (exit)
    mov rdi, 0      ; arg 1 = 0 (OK)
    syscall         ; call exit
Run Code Online (Sandbox Code Playgroud)

这是我运行可执行文件时的输出:hello, world!% …

linux zsh x86-64 nasm system-calls

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

是否可以在函数调用中初始化对象参数?

我知道有一个像这样初始化对象的简写:

Point p = {0, 0} // x = 0, y = 0
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以使用它来创建一个ad-hoc对象作为函数调用的参数,而不首先将其存储在变量中?这是一个说明性的例子,展示了我是如何尝试这样做的,希望能够更好地了解我正在尝试做的事情:

Point p = addPoints(&{1, 2}, &{3, 4}, &{5, 6});
Run Code Online (Sandbox Code Playgroud)

c++ parameters object

-1
推荐指数
1
解决办法
49
查看次数