Tag: c ++ 14

当b大于a中的位数时,右移(a >> b)的未定义行为?

显然,右移操作的行为: a >> b 当b >= sizeof(a)*CHAR_BIT时,在C和C ++中未定义(而在正常情况下,由于右移而从左侧引入的“新位”等于零)。 当b >= sizeof(a)*CHAR_BIT时,为什么这种未定义的行为比将结果设置为零更好?

C类结构中自动字段重新排序的方法

有没有办法在C-like结构中执行自动字段重新排序 ? 我的意思是使用语言function(如C和C ++的预处理器和C ++的模板/类型特征/等),这使得可以执行以下宏(类似Boost.Fusion的样式来适应结构): REARRANGE(StructureName, (int8_t)(FieldName1), (int32_t)(FieldName2), (int16_t)(FieldName3), (int32_t)(FieldName4)); // is equivalent to (without loss of generality): struct StructureName { int32_t FieldName2; int32_t FieldName4; int16_t FieldName3; int8_t FieldName1; }; 当然,方法应考虑alignof值(以及sizeof ),如果可能,还应考虑#pragma pack current value。 我知道结果的可移植性差,但仅供本地使用。 将字段名称与各个类型一起保存是强制性的。 目的是减少总体结构尺寸。

如何读取二进制数作为输入?

有没有办法让用户在C或C ++中输入二进制数? 如果我们写类似的东西 int a = 0b1010; std::cout << a << std::endl 然后输出结果为10(使用适当的编译器扩展时)。 但是当我们试着写的时候 int n; std::cin >> n; int t = 0bn; 它给了我们一个错误,所以任何人都可以建议我们如何直接读取二进制数作为输入而不是使用字符串来存储输入?

如何在编译时提取没有路径和后缀的源文件名?

同时使用带有-std = c11的gcc和带有-std = c ++ 14的g ++。 例如,对于名为src/dir/Hello.cxx的文件,它应该扩展为例如: const char basename[] = “Hello”; 要么 const char basename[] = getStaticBasename(__FILE__); 其中getStaticBasename()是一个宏(对于C源)或constexpr函数(对于C ++源),其结果为“Hello”。 我必须避免在运行时从__FILE__中拆分字符串,因为路径和后缀不能以任何方式编译到可执行文件中。 解决方案必须不依赖于诸如boost之类的大型库。 因为我没有makefile,所以在我的情况下不能使用这样的解决方案。 有人有解决方案吗? 编辑2015-07-02: 我对如何调用编译器和链接器没有影响(有时通过makefile,有时来自命令行,或某些IDE(Eclipse CDT托管make,Crossworks,Xcode等等)。所以解决方案只需要代码。 我的用例是为小型日志记录解决方案提供某种“通用区域标识符”。 应用程序代码(使用我的记录器)应仅#include 并且在稍后调用例如LOG_DEBUG(…)我将隐含地使用自动生成的“通用区域标识符”。 我目前的解决方案是应用程序代码必须声明一个JOE_LOG_FILE_REGION(Hello); (在#include ),它可以在其代码中放置LOG_DEBUG(…) 。