我在以下位置定义了以下用户定义的文字MyLiteral.h:
namespace my_literals {
constexpr uint64_t operator"" _nanoseconds(unsigned long long int value) {
return value*1000;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以在另一个标题中使用运算符SomeComponent.h:
using namespace my_literals;
namespace foo {
constexpr uint64_t timeout = 10_nanoseconds;
}
Run Code Online (Sandbox Code Playgroud)
但是,我不想污染范围using namespace my_literals,因为这会为*.cpp包含的所有文件提供文字定义SomeComponent.h.
我怎么能避免这个?在g ++中constexpr uint64_t timeout = my_literals::10_nanoseconds;给出数字常量之前的预期unqualified-id.
我想隐藏API用户的服务(接口)的实现(具体类).该实现由使用Java API ServiceLoader机制的工厂提供给用户.此Loader要求实现类具有公共可见性.只要实现隐藏在用户不直接依赖的不同JAR(除了API JAR之外),就可以了.
但是,为了便于分发,使用默认实现的JAR内容将打包到API JAR中.因此,用户有效地依赖于此预先打包的JAR,其中默认实现类可用于公共可见性.没有什么能阻止人们直接实例化实现.我不希望那是可能的.
我的坏主意:
您认为正确的方法是什么?妥协吗?
使用OSGi或其他重型机械是不可能的.
有没有静态代码分析工具可以发现 JNI(方法)签名字符串中的错误?例如,以下代码在语法上不正确(完全限定类名后缺少分号):
(*env)->GetMethodID(env, someClassId, "aMethod","(ILfoo/bar/TheClass)V");
Run Code Online (Sandbox Code Playgroud)
编辑:代码分析工具不需要检查 foo/bar/TheClass 是否存在,而只需根据 JNI 规范检查字符串的语法是否有效。
这个问题的背景是,上面的代码触发了分段错误。这始终是一种烦人的调试情况,但在这种情况下静态分析应该非常容易,可以节省大量时间。
如果计数大于类型的宽度,如右移未定义行为中所讨论的那样?如果位移数超过有效操作数大小,则移位值是不确定的.
因此,在下面,值bar是未定义的:
uint32_t foo = 123;
uint32_t bar = (foo >> 33);
Run Code Online (Sandbox Code Playgroud)
这种轮班操作是否定义明确std::bitset?如:
std::bitset<32> foo(123);
std::bitset<32> bar(foo >> 33);
Run Code Online (Sandbox Code Playgroud)
我可以在哪个官方文件中找到这样的信息?
该案例未在cppreference上明确说明(https://en.cppreference.com/w/cpp/utility/bitset/operator_ltltgtgt).