我将 Android Studio 设置中的项目默认位置从 更改/Documents/Android Studio projects为/Documents/AndroidProjects。然后我在文件资源管理器中将现有项目从前者移动到后者。然后我打开 Android Studio 并导入该项目。现在构建时出现此错误:
Build file 'C:\Users\Sourav Kannantha B\Documents\AndroidProjects\Skara\app\build.gradle' line: 1
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.internal.application']
> Failed to get default debug keystore location.
Run Code Online (Sandbox Code Playgroud)
我检查了所有的 gradle 文件,没有提到任何与路径相关的内容。所以我不知道是什么导致了这个错误。请帮我。
整个错误日志:
FAILURE: Build failed with an exception.
* Where:
Build file 'C:\Users\Sourav Kannantha B\Documents\AndroidProjects\Skara\app\build.gradle' line: 1
* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.internal.application']
> Failed …Run Code Online (Sandbox Code Playgroud) android file-move android-studio build.gradle android-gradle-plugin
当我用 C++ 编程时,using namespace std;我通常倾向于使用std::前缀组件,例如等std::cout,而不是编写std::cin。但是后来我遇到了 ADL 以及为什么应该使用using std::swap;。
标准库(在 std 内)的许多组件以不合格的方式调用交换,以允许调用非基本类型的自定义重载,而不是此通用版本:在与其所属类型相同的命名空间中声明的交换的自定义重载提供通过对此通用版本进行参数相关的查找来选择。
但在所有有关 ADL 的资料中,他们只提到std::swap. 还有其他类似的功能在使用时需要注意吗?或者对于所有其他功能,我应该使用完全限定名称吗?或者我应该为中的每个函数使用非限定名称std::?
编辑:(在表达我最初的问题时,我不清楚。这是我在写问题时的确切意图。)
C++ 标准库中是否还有其他函数是基于 ADL 的自定义的热门候选函数,类似于std::swap,因此当我使用它们时,我必须谨慎使用using std::foo; foo();表单而不是std::foo();直接调用?
c++ std qualified-name argument-dependent-lookup unqualified-name
在我的程序中,我将斜率值作为用户的输入。代码片段如下所示:
double m;
std::cout << "Enter slope value:";
std::cin >> m;
Run Code Online (Sandbox Code Playgroud)
但目前我无法给出“无穷大”作为斜率值。如果输入“inf”,m 将存储 0,可能是由于解析错误。如果我输入非常大的数字,例如 1e1000,m 将存储 DBL_MAX,即 1.79769e+308。
那么我应该在控制台中输入什么,以便 m 包含“无穷大”的值?(垂直线的斜率)。
编译 .java 文件时,它会生成一个包含字节码的 .class 文件。JVM 获取该字节码并执行它。这一步的字节,如果抛出异常,还会在源代码中提到这个错误发生在哪一行。但是字节码和源代码中的行号将完全不同,并且字节码在编译期间也不存储行号,因为我没有找到任何与之相关的助记符(并且存储行号只会增加代码大小)。那么有人可以告诉我 JVM 如何在抛出异常的源代码中获取确切的行号。
虽然Java的类型擦除有明显的优势(主要是减少生成的代码)为什么C++没有这个特性?我知道这种类型的泛型有许多其他限制,比如你不能在函数内部使用泛型类型(因为它被删除了),你只能将“类”类型传递给它,而不是像 C++ 等中的原始类型等等。
但是如果需要的话,C++ 可以同时拥有......当用户想要在函数内部使用类型时,他可以使用模板样式,否则他可以在泛型类/函数的声明期间使用类型擦除样式。为什么不是这样?我不想要任何基于意见的答案.. 究竟是什么阻止了这一点?
编辑
例如,
class A {
virtual void do_something() {}
};
class B: public A {
virtual void do_something() {}
};
template <class T>
void call_do_something(T arg) {
arg.do_something();
}
int main {
A a = new A()
call_do_something(a);
B b = new B()
call_do_something(b);
retrun 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,编译时,这将生成两个版本的 call_do_something,一个用于 A,一个用于 B。但是 java 中的等效代码只会生成一个。这将减少使用容器时生成的代码。这是我想知道的示例用例,如何有效处理。我绝不是想说 Java 在所有情况下都比 C++ 具有更好的泛型。对困惑感到抱歉。
Windows 和 Unix 有自己的x86-64 调用约定。但是,如果一种语言需要/从中受益,它可以有自己的调用约定供内部使用吗?例如,Swift / Python(已编译)可能会受益于拥有多个寄存器来从函数返回多个结果(因为这些语言支持这一点)。因此,保留 3 个寄存器 ( rax、rcx、rdx),用于其语言调用约定中的返回值,这会破坏任何内容吗?导致任何未被注意到的错误,或者在任何情况下导致未定义的行为?
另外,如果不需要遵循该约定,那么为什么他们要为用户空间定义调用约定?
如果我想按字典顺序比较两个向量,我可以这样做:
int main() {
std::vector<int> a{0, 7, 8, 9};
std::vector<int> b{1, 2, 3, 4};
std::cout << std::boolalpha;
std::cout << "a < b returns " << (a < b) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
但是以相反的顺序执行相同的操作无法编译:
int main() {
std::vector<int> a{3, 2, 1};
std::vector<int> b{9, 8, 7, 6};
std::cout << std::boolalpha;
std::cout << "revrese a < reverse b returns " << ((a | std::views::reverse) < (b | std::views::reverse)) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
后一个代码失败并显示:
<source>:23:81: error: no match for 'operator<' (operand types are 'std::ranges::reverse_view<std::ranges::ref_view<std::vector<int> > >' …Run Code Online (Sandbox Code Playgroud) c++ vector comparison-operators lexicographic-ordering std-ranges
是否有可能以编程方式知道 git 将使用哪个编辑器?这样的事情可能吗?
$git which editor
/usr/bin/nano
Run Code Online (Sandbox Code Playgroud)
基本上,我只想为 git 提交消息调用自定义编辑器。因此,如果文件名是“.git/COMMIT_EDITMSG”,我将调用其他内容,否则我想回退到默认的 git 编辑器。
我知道 git 使用$GIT_EDITOR, core.editor, $VISUAL,$EDITOR来选择编辑器。但这一切都不存在,我不知道该怎么办。这里说,它使用vi. 但在我的机器上,它使用nano. 因此,对其进行硬编码并不真正可靠。
那么,如何知道 git 将以编程方式使用哪个编辑器呢?如果不是直接从 git 获取,还有其他解决方法吗?
根据 cppreference,一个volatile限定变量的存储不能重新排序为另一个volatile限定变量。换句话说,在下面的示例中,当 y 变为 20 时,可以保证 x 为 10。
volatile int x, y;
...
x = 10;
y = 20;
Run Code Online (Sandbox Code Playgroud)
根据维基百科,ARM 处理器的一个存储可以在另一个存储之后重新排序。因此,在下面的示例中,第二个存储可以在第一个存储之前执行,因为两个目的地是不相交的,因此它们可以自由地重新排序。
str r1, [r3]
str r2, [r3, #4]
Run Code Online (Sandbox Code Playgroud)
有了这样的理解,我写了一个玩具程序:
volatile int x, y;
int main() {
x = 10;
y = 20;
}
Run Code Online (Sandbox Code Playgroud)
我预计生成的程序集中会出现一些围栏,以保证 x 和 y 的存储顺序。但为 ARM生成的程序集是:
main:
movw r3, #:lower16:.LANCHOR0
movt r3, #:upper16:.LANCHOR0
movs r1, #10
movs r2, #20
movs r0, #0
str r1, [r3]
str r2, [r3, #4] …Run Code Online (Sandbox Code Playgroud) 以前我见过很多C++函数的汇编。在 gcc 中,所有指令都以以下指令开头:
push rbp
mov rbp, rsp
sub rsp, <X> ; <X> is size of frame
Run Code Online (Sandbox Code Playgroud)
我知道这些指令存储前一个函数的帧指针,然后为当前函数设置一个帧。但在这里,程序集既不要求映射内存(如 malloc),也不检查所指向的内存是否rbp分配给进程。
因此它假设启动代码已经为调用堆栈的整个深度映射了足够的内存。那么到底为调用堆栈分配了多少内存呢?启动代码如何知道调用栈的最大深度?
这也意味着,我可以远距离访问越界数组,因为虽然它不在当前帧中,但它映射到进程。所以我写了这段代码:
int main() {
int arr[3] = {};
printf("%d", arr[900]);
}
Run Code Online (Sandbox Code Playgroud)
当索引为 900 时,它会退出。SIGSEGV但令人惊讶的是,当索引为 901 时,它不会退出。同样,SIGSEGV对于某些随机索引,它会退出,而对于某些索引则不会。在编译器资源管理器中使用 gcc-x86-64-11.2 进行编译时观察到此行为。
c++ ×6
assembly ×3
x86-64 ×2
android ×1
arm ×1
build.gradle ×1
callstack ×1
cin ×1
double ×1
editor ×1
file-move ×1
generics ×1
git ×1
java ×1
jvm-bytecode ×1
line-numbers ×1
std ×1
std-ranges ×1
templates ×1
type-erasure ×1
user-input ×1
vector ×1
volatile ×1
x86 ×1