小编ste*_*ano的帖子

在c ++中,从unsigned int到int的转换总是保留位模式吗?

从标准(4.7)看起来,当它们使用相同数量的位时,从int转换为unsigned int,纯粹是概念性的:

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 结束说明]

因此,在此方向上,转换会保留位掩码.我不确定标准是否保证从unsigned int到int的转换相同(同样,假设使用相同的位数).这里的标准说:

如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则该值不变; 否则,该值是实现定义的.

这究竟是什么意思"目的地类型"?例如,2 ^ 32-1不能用32位int表示.这是否意味着它无法在目标类型中表示,因此不能假设位模式保持不变?

c++ casting language-lawyer

12
推荐指数
1
解决办法
1696
查看次数

在包中导入protobuf生成的模块

这是我的目录结构.

.
|-- A
|   |-- B
|   |    `-- b.proto
|   `-- C
|        `-- c.proto
`-- py_gen
Run Code Online (Sandbox Code Playgroud)

我像这样编译test.proto

protoc --python_out=py_gen/ --proto_path ${ROOT}/A ${ROOT}/A/B/b.proto \
       ${ROOT}/A/C/c.proto
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果.

.
`-- py_gen
          |-- B
          |    `-- b_pb2.py
          `-- C
               `-- c_pb2.py
Run Code Online (Sandbox Code Playgroud)

一切正常,如果我在PYTHONPATH中包含$ {ROOT}/A/B/py_gen/B和$ {ROOT}/A/B/py_gen/C,我可以导入每个模块并使用该模块.

例如,当模块c导入b时会出现问题.这将转换为生成的c导入代码

 import B.b_pb2
Run Code Online (Sandbox Code Playgroud)

这是预期的,因为"在Python中,包通常由目录结构决定"(来自protobuf教程).但是,我无法导入模块c,因为它找不到B.b_pb2.py.为了让它工作,我必须在生成的目录B和C中添加空的__init__.py文件.那么为什么生成的目录结构中没有__init__.py?我忘记了什么吗?我是python的新手,所以我可能会忽略一些明显的东西.但阅读python 教程

需要__init__.py文件才能使Python将目录视为包含包.

python protocol-buffers

10
推荐指数
1
解决办法
2050
查看次数

跨类共享配置对象的最佳方法是什么?

让我们说我有M,A,B,C类.M是我的应用程序的主要类(这是完成大部分工作的那个)并具有这种结构

class M {
  public:
    // Something here.
  private:
    Conifg config;
    A a;
    std::vector<B> bs;
    const C* c;
};
Run Code Online (Sandbox Code Playgroud)

在一个主要的我创建一个M类的实例m,我想设置我的配置对象,比如从文件中读取它.配置对象没什么特别的,它可以是协议缓冲区或简单的结构.

现在,我希望a,b和c能够访问配置对象,因为它们需要一些全局设置.这些设置是全局的,它们不会改变,并且对于A,B和C(和M)的每个实例都是相同的.我目前正在做的是在每个类A,B和C中都有一个静态字段,我正在为这些类的每个实例设置一个配置对象的副本.我不希望这些类知道M.的存在.这是最好的解决方案吗?我是否应该想到一个全局配置变量?

c++

6
推荐指数
2
解决办法
3857
查看次数

标签 统计

c++ ×2

casting ×1

language-lawyer ×1

protocol-buffers ×1

python ×1