我在项目中切换到固定长度的整数类型主要是因为它们帮助我在使用它们时更清楚地考虑整数大小.包括他们通过#include <inttypes.h>还包括了如印刷宏一帮其他的宏PRIu32,PRIu64...
要为固定长度变量分配常量值,我可以使用像UINT32_C()和的宏INT32_C().每当我分配一个恒定值时,我就开始使用它们.
这导致代码类似于:
uint64_t i;
for (i = UINT64_C(0); i < UINT64_C(10); i++) { ... }
Run Code Online (Sandbox Code Playgroud)
现在我看到几个不关心它的例子.一个是stdbool.h包含文件:
#define bool _Bool
#define false 0
#define true 1
Run Code Online (Sandbox Code Playgroud)
bool在我的机器上有1个字节的大小,所以它看起来不像int.但是,0和1应应自动转为正确的类型由编译器整数.如果我在我的示例中使用它,代码将更容易阅读:
uint64_t i;
for (i = 0; i < 10; i++) { ... }
Run Code Online (Sandbox Code Playgroud)
那么我何时应该使用固定长度的常量宏UINT32_C(),何时应该将该工作留给编译器(我正在使用GCC)?如果我在MISRA C中编写代码怎么办?
我想在同一个分配的内存中存储不同的数据类型,以便通过仅分配一次内存来减少执行时间.我发现实际上可以创建一个uint8_t变量数组并创建一个uint16_t指向同一内存地址的新指针,然后我可以双向读取这些值.
这允许我创建一个指针,让我们说分配内存的中间,并将值存储在后半部分的不同数据类型中.
可以这样做吗?我知道我需要关注内存边界,但这是不好的风格?
这是我的代码:
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdlib.h>
int main(void){
uint8_t *array;
uint16_t *array2;
array = calloc(6, 1);
array[0] = 257;
printf("array[0]= %" PRIu8 "\n", array[0]);
printf("array[1]= %" PRIu8 "\n", array[1]);
printf("Adresse von array[0] = %p\n", &array[0]);
array2 = &array[0];
printf("Adresse auf die array2 zeigt = %p\n", array2);
array2[0] = 257;
printf("array2[0]= %" PRIu16 "\n", array2[0]);
printf("array2[1]= %" PRIu16 "\n", array2[1]);
printf("array[0]= %" PRIu8 "\n", array[0]);
printf("array[1]= %" PRIu8 "\n", array[1]);
getchar(); …Run Code Online (Sandbox Code Playgroud) 我想使用类似于chux建议的联合数组
union {
uint8_t u8[12];
uint16_t u16[6];
} *array_u;
array_u = calloc(1, sizeof *array_u);
assert(array_u);
printf("array_u->u8[0] = %" PRIu8 "\n", array_u->u8[0]);
array_u->u16[0] = 1234;
printf("array_u->u16[0] = %" PRIu16 "\n", array_u->u16[0]);
...
Run Code Online (Sandbox Code Playgroud)
我想将它用作不同文件需要访问它的全局数组.所以我尝试过globals.h:
extern union {
uint8_t u8[12];
uint16_t u16[6];
} *array_u;
Run Code Online (Sandbox Code Playgroud)
我想在这个文件中分配并释放它memory.c:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include "globals.h"
void allocate_array_u(void){
array_u = calloc(1, sizeof *array_u);
}
Run Code Online (Sandbox Code Playgroud)
我很遗憾地收到了一个 error LNK2001: unresolved external symbol array_u
我该如何解决这个问题?
解决方案:
我忘了在main.c或中定义联合 …
我MathFuncsDll.dll从https://msdn.microsoft.com/de-de/library/ms235636.aspx创建了没有问题的.我也可以在不同的C++项目中使用数学函数而不会出现问题.
现在我想在Excel VBA中使用这些功能.我试过了:
Public Declare Function DLL_Import_Add Lib "C:\Users\User\Desktop\MathFuncsDll.dll" Alias "Add" (ByVal a As Double, ByVal b As Double) As Double
Sub test()
MsgBox DLL_Import_Add(2.1, 3.3)
End Sub
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个Run-time error '453'无法找到的DLL入口点.
我该如何解决这个问题?
MathFuncsDll.h:
// MathFuncsDll.h
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif
namespace MathFuncs
{
// This class is exported from the MathFuncsDll.dll
class MyMathFuncs
{
public:
// Returns a + b
static MATHFUNCSDLL_API double Add(double a, double b);
// Returns …Run Code Online (Sandbox Code Playgroud) 我是新手compgen,想将它用于我正在编写的脚本。该脚本可以将“命令”和“选项”作为参数,如下所示:
script add "value"
script --path "/a/file/path" add "value"
# and others
Run Code Online (Sandbox Code Playgroud)
我写了一个完成脚本,如下所示:
_script_completions() {
arg_index="${COMP_CWORD}"
if [[ "${arg_index}" -eq 1 ]]; then
COMPREPLY=($(compgen -W "--path add" "${COMP_WORDS[1]}"))
fi
}
complete -F _script_completions script
Run Code Online (Sandbox Code Playgroud)
该脚本对于“add”命令运行良好,但在“--path”选项上失败。例如:当我输入:
$ script --p<TAB>
Run Code Online (Sandbox Code Playgroud)
我得到:
$ ./script --pbash: compgen: --: invalid option
compgen: usage: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
Run Code Online (Sandbox Code Playgroud)
如何正确添加我自己的脚本选项的补全?