我正在通过stm研究STM32l151rct6a,我偶然发现了这些MACRO定义
__CC_ARM, __ICCARM__, __GNUC__, __TASKING__
Run Code Online (Sandbox Code Playgroud)
有谁知道他们的意思?
我最近编写了一些代码,用于memcpy
将float
/解包double
为适当宽度的无符号整数,然后使用一些位移将符号位与组合的有效数字/指数分开。
\n\n注意:对于我的用例,我不需要将后两部分彼此分开,但我确实需要它们以正确的顺序排列,即:
\n{sign, (exponent, significand)}
,后一个元组包装为足够宽度的无符号整数。
我的代码运行良好,经过彻底测试,没有任何问题;然而,我有点震惊地发现 IEEE-754 没有指定其二进制交换格式 \xe2\x80\x94 的字节顺序,据我所知,这意味着我的位移位在极少数情况下float endianness \xe2\x89\xa0 integer endianness。
\n根据此处回答的问题,我的假设是,鉴于位移位与存储中的实际字节序无关,我只需要担心浮点数的字节序是否与整数的字节序匹配。
\n我松散地遵循链接答案中的代码设计了以下代码,但避免通过指针强制转换使用类型双关,这对我来说似乎是未指定/未定义的行为领域:
#include <cstdint>\n#include <cstring>\n\n// SAME means "same as integer endianness"\nenum class FloatEndian { UNKNOWN, SAME, OPPOSITE, };\n\nFloatEndian endianness() {\n float check = -0.0f; // in IEEE-754, this should be all-zero significand and exponent with sign=1\n std::uint32_t view;\n std::memcpy(&view, &check, sizeof(check));\n switch (view) {\n case 0x80000000: // sign …
Run Code Online (Sandbox Code Playgroud) 通常,C 文件 I/O 是使用完成的,FILE*
因为这是标准库函数都采用的。
在 C 中,也可以有一个const 指针,指针的地址不能改变(但它指向的值可以)。
我想知道这是否可以应用于FILE*
,所以写了这个小程序来测试这个:
#include <stdio.h>
int main(void) {
FILE* const file = fopen("somefile.txt", "w");
if (file != NULL) {
fprintf(file, "%s\n", "So this works? That's just swell!");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这可以很好地编译并使用 GCC 在 Ubuntu/Linux 16.04 上按预期工作(该文件包含我预期的字符串),但我不确定这个习语是否是一个好主意 - 该FILE
类型在设计和处理上是不透明的是特定于实现的。
因为不能保证任何 C 库实现都不会尝试更改FILE
指针的地址,所以在 C 中执行 I/O 时不使用这种方法是否更安全?
我有一个包装数组的类。它继承自一个抽象基类,virtual constexpr
为函数调用运算符定义一种方法。在子类中,我重写所述方法并访问内部数组:
#include <cstddef>\n#include <array>\n#include <initializer_list>\n\ntemplate <typename T, std::size_t N>\nclass ContainerBase {\npublic:\n virtual constexpr const T& operator()(std::size_t i) const = 0;\n};\n\ntemplate <typename T, std::size_t N>\nclass Container : public ContainerBase<T, N> {\npublic:\n constexpr Container(std::initializer_list<T> data) {\n std::copy(data.begin(), data.end(), _items.begin());\n }\n constexpr const T& operator()(std::size_t i) const override {\n return _items[i];\n }\nprivate:\n std::array<T, N> _items;\n};\n\nint main () {\n constexpr Container<int, 3> C = {2, -91, 7};\n constexpr int F = C(1);\n\n static_assert(F == -91);\n}\n
Run Code Online (Sandbox Code Playgroud)\n这是Godbolt 链接。 …
我想分享我用C/C++(Linux环境gcc/g ++编译器)编写的项目作为共享库/静态库而不实际共享源代码.这样其他用户就可以在不知道我的源代码的情况下使用我的项目.任何人都可以告诉我如何以.so/.a格式分享它?
假设,我的项目看起来像:
main.cpp, source1.cpp, source2.cpp, source3.cpp, head1.h, Makefile
如何通过隐藏文件source1.cpp,source2.cpp和source3.cpp的源代码并将它们作为共享库/静态库来共享此项目.main.cpp文件包含main()函数.告诉我详细的程序.
PS:我是共享库/静态库的新手.
由于 char 只有 1 个字节长,因此在处理 8 位 unsigned int 时使用 char 是否更好?
示例:我试图创建一个结构来存储颜色的 RGB 值。
struct color
{
unsigned int r: 8;
unsigned int g: 8;
unsigned int b: 8;
};
Run Code Online (Sandbox Code Playgroud)
现在由于它是 int,所以在我的例子中它分配了 4 个字节的内存。但如果我用 unsigned char 替换它们,它们将按预期占用 3 个字节的内存(在我的平台中)。
c ×4
c++ ×3
c++20 ×1
char ×1
compiler-bug ×1
constexpr ×1
embedded ×1
endianness ×1
file-io ×1
ieee-754 ×1
integer ×1
performance ×1
pointers ×1
portability ×1
types ×1
unix ×1
visual-c++ ×1