我的一位同事正在我们一起工作的项目中实现一个新功能,他通过从同一个项目中获取包含类似功能实现的文件来创建它,创建一个重命名所有全局声明并稍微修改它的副本.实现.所以我们最终得到了两个大文件,除了重命名之外几乎完全相同.
我试图解释它使我们的项目更难维护,但他不想改变任何说他更容易以这种方式编程的东西,并且没有理由修复代码,如果它"不是打破了".
我怎么能说服他这样的代码重复是件坏事呢?
它与这些问题有关,但我对针对技术人员(另一个程序员)的答案更感兴趣,例如,对书籍这样的权威来源的引用会很棒.我已经尝试过简单的参数并且没有成功.
如果在包含类之外仍然无法访问Java中私有内部类公共成员的原因是什么?或者可以吗?
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
public boolean hasNext() { // Why public?
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud) 我看到了两者Class.getResource
并ClassLoader.getSystemResource
习惯在Java中找到资源.有什么理由喜欢彼此吗?
我正在用Java编写一个解释器,用于具有某些脚本功能的特定于域的语言.我已经实现了一个解析器,现在需要做一个后端.为此,我正在考虑编写自己的解释器(使用抽象语法树或使用一些自定义字节码)或目标JVM(在运行时发出并执行Java字节码).
在这方面有更多经验的人是否可以说针对JVM的方法有多可行?您建议使用哪些库来发布Java字节码?
对于这个简化的测试用例:
#include <map>
class Tester {
int foo;
std::map<int, int> smap;
};
int main() {
Tester test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下编译器警告:
$ clang++ -std=c++98 -Weverything test.cc
test.cc:5:24: warning: padding class 'Tester' with 4 bytes to align 'smap' [-Wpadded]
std::map<int, int> smap;
^
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个警告意味着什么,以及我应该如何解决它?
我一直在尝试使用std::format
C++20中包含的函数。据我所知,clang 14 应该支持此功能,但由于某种原因我收到以下错误:no member named 'format' in namespace 'std'
。根据cppreference 的编译器支持图表,clang 应该支持文本格式,但我仍然收到此错误。我不知道问题是什么。
我正在开发一个搜索系统的后端应用程序.搜索系统将文件复制到临时目录并为其提供随机名称.然后它将临时文件的名称传递给我的应用程序.我的应用程序必须在有限的时间内处理每个文件,否则它将被关闭 - 这是一种看门狗般的安全措施.处理文件可能需要很长时间,所以我需要设计能够处理这种情况的应用程序.如果我的应用程序在下次搜索系统想要索引同一文件时关闭,它可能会给它一个不同的临时名称.
显而易见的解决方案是在搜索系统和后端之间提供一个中间层.它会将请求排入后端并等待结果到达.如果请求在中间层超时 - 没问题,后端将继续工作,只有中间层重新启动,并且当搜索系统稍后重复请求时,它可以从后端检索结果.
问题是如何识别文件.他们的名字随机变化.我打算使用像MD5这样的哈希函数来散列文件内容.我很清楚生日悖论,并使用链接文章中的估计来计算概率.如果我假设我有不超过100 000个文件,那么具有相同MD5(128位)的两个文件的概率大约为1,47x10 -29.
我应该关心这种碰撞概率还是假设相等的散列值意味着相同的文件内容?
是否可以使用SFINAE检测C++中是否存在类?如果可能的话怎么样?
假设我们有一个只由某些版本的库提供的类.我想知道是否可以使用SFINAE来检测该类是否存在.检测结果是任意的,比如枚举常数,如果存在,则为1,否则为0.
考虑以下示例(godbolt):
#include <iostream>
template <typename T>
const T *as_const(T *p) { return p; }
void f() {}
template <typename T>
void g(T *) { std::cout << "A"; }
template <typename T>
void g(const T *) { std::cout << "B"; }
int main() {
g(as_const(&f));
}
Run Code Online (Sandbox Code Playgroud)
GCC和Clang都可以编译它,但生成的可执行文件产生不同的输出:用GCC打印编译的版本A
和用Clang打印编译的版本B
.
你能解释一下这个区别吗?
更新:正如@VTT指出的那样,即使as_const
被删除也会观察到相同的差异.
String s1 = "The quick brown fox jumps over the lazy dog";
String s2 = "";
boolean b = s1.contains(s2);
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
我运行上面的Java代码,b返回true.由于s2为空,为什么s1包含s2?
我检查了Java API,它写道:
当且仅当此字符串包含指定的char值序列时,才返回true.
参数:
s - 要搜索的序列
返回:
如果此字符串包含s则返回true,否则返回false
c++ ×4
java ×4
clang++ ×2
templates ×2
bytecode ×1
clang ×1
coding-style ×1
const ×1
copy-paste ×1
estimation ×1
fmt ×1
gcc ×1
jvm ×1
md5 ×1
probability ×1
refactoring ×1
resources ×1
sfinae ×1
string ×1