来自ISO/IEC 9899:
7.18.1.2最小宽度整数类型
1 typedef名称int_leastN_t指定宽度至少为N的有符号整数类型,这样没有较小大小的有符号整数类型至少具有指定的宽度.因此,int_least32_t表示宽度至少为32位的有符号整数类型.
为什么我应该使用这种类型?
当我决定采用哪种类型来获取我需要的变量时,我会问自己:"它能携带的最大价值是什么?"
所以我将找到一个答案,检查哪个是最大的2 n,哪个大于那个,并采用匹配的精确整数类型.
所以在这种情况下我也可以使用最小宽度整数类型.但为什么?正如我已经知道的那样:它永远不会是一个更大的价值.那么为什么要采取有时可以覆盖的东西呢?
所有其他情况我可以想象哪里甚至无效的ie:
"我的类型至少是......的大小......" - 这个实现无法知道我将获得的最大(例如)用户输入是什么,因此在编译时调整类型将无济于事.
"我有一个变量,我无法确定它将在运行时保持的值大小."
- 编译器在编译时如何知道? - >它也找不到拟合字节大小.
那么这些类型的用途是什么?
我想调试我的代码并且无法访问过程中的内部层,因为这会干扰与硬件的通信。(在监视列表会干扰基本读取访问的地方执行易失性操作。)
所以我正在测试接口的返回值,但 IAR 编译器甚至优化了未使用的 volatile 变量。
和这样的声明:
i = object.foo();
if (i)i=i;
Run Code Online (Sandbox Code Playgroud)
也没有帮助。
我在这里找到了 SO 只是回答了该案例使用 i/o 操作的建议。但这也不是选项,因为我没有包含 C 标准库的选项。并且项目本身不需要输入/输出,没有自己的输入/输出功能变体。
那么除了禁用优化器之外,我还有哪些选择?
我目前正在使用 kqueue 来处理服务器进程中每个线程的多个客户端,因此我不希望在出现信号 SIGPIPE 时终止线程,我只想从 kqueue 中删除相应的 socked id。所以我的问题是:有没有办法在 Signalhandle 中获取相应的 socketid 并将其解析回进程以将其从事件 kqueue 中删除,或者我是否只需将 SIG_IGN SIGPIPE 并通过返回 -1 来处理删除发送?它会在超时时间后返回-1值还是立即返回发送-1?
最后,如果信号忽略是我的解决方案: id 必须在哪里放置声明
typedef void (*sig_t) (int);
sig_t
signal(int sig, sig_t func);
Run Code Online (Sandbox Code Playgroud)
它必须在 main 函数中吗?或者在相应线程的开头?或者只是作为全局元素?
我正在尝试编译多次调用以下makro的代码:
#define MULADD(i, j) \
asm( \
" mullw 16,%6,%7 \n\t" \
" addc %0,%0,16 \n\t" \
" mulhwu 16,%6,%7 \n\t" \
" adde %1,%1,16 \n\t" \
" addze %2,%2 \n\t" \
:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16");
Run Code Online (Sandbox Code Playgroud)
在哪里调用MULAD我得到了
错误:在':'标记之前预期')'
错误通知.
错误代码如下所示:
../../src/math/mul.c: In function 'mul_comba':
../../src/math/mul.c:787: warning: implicit declaration of function 'asm'
../../src/math/mul.c:787: error: expected ')' before ':' token
../../src/math/mul.c: In function 'mul_comba_small':
../../src/math/mul.c:816: error: expected ')' before ':' token
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么,隐含的声明是什么意思?据我所知asm(),编译器是保留的,因此不是必须声明的函数,有吗?如果是的话,我必须包括什么?我真的不知道.
编辑:我正在使用gcc 4.2.1 arch是标记为powerpc(32位),操作系统是freeBSD 9.2
我得到了一行代码,这非常有用:
void *test;
/*...*/
test = &va_arg(arg_list, int);
Run Code Online (Sandbox Code Playgroud)
我只是尝试这个,正如我想的那样,这是一个宏而不是一个函数,所以它可能会起作用.我并没有真正期待它能够发挥作用,但它完全符合我的要求.
但是现在我不确定这种风格可能发生的地址的生命周期和其他风险.
谁能告诉我为什么使用va_arg这种方式的参考是安全/不安全的?
我想要一个类似于这个(无效)的构造:
const uint8_t uArray[] = { uint8_t(sizeof(uArray)), 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
并且uArray [0]应为4并在编译时自动填充,这是USB描述符定义的情况,通常表示为字节数组,第一个字节值是元素中的大小.
这在理论上应该是可能的,因为数组已经初始化但不知何故我无法表达它.
欢迎任何解决此问题的建议.
警告[...]:未定义的行为:在此语句x.cpp xxx中未定义volatile访问的顺序
为什么这一行是未定义的行为?
case 2:
Vdda = 3.3 * (*VREFINT_CAL) / ADC_DR->DATA;
Run Code Online (Sandbox Code Playgroud)
声明/初始化的位置是:
volatile short const *VREFINT_CAL = (short *) 0x1FFFF7BA;
Run Code Online (Sandbox Code Playgroud)
和
volatile STRUCT_ADC_DR *ADC_DR = (STRUCT_ADC_DR*) 0x40012440;
Run Code Online (Sandbox Code Playgroud)
被定义为:
typedef struct
{
unsigned DATA : 16;
unsigned : 16;
} STRUCT_ADC_DR;
Run Code Online (Sandbox Code Playgroud)
是因为编译器不确定易失性元素在访问它们的顺序中可能会有不同的行为吗?(这是怎么回事)
但是,由于运营商具有相同的优先级,是否应该确保计算从左到右执行?
受到这个PCG挑战的启发:https://codegolf.stackexchange.com/q/61836/31033 我问自己,如果在编译这样的工具时(无论是浏览器还是浏览器),都会尝试尽可能少地留下痕迹其他东西),是否有某种方式(针对gcc/clang,因为这可能是在这样一个工作环境中预装的命令行编译器)将源代码作为命令行参数或相等机制交给编译器,而不需要源代码beeing保存为*.c文件,用户通常会这样做?
(当然编译器会在编译时生成临时文件,但那些可能不会被扫描.)
我问自己,我可以使用严格别名的BSD套接字,而不是通过编译gcc获得未定义的行为吗?
bind(sdListen, (struct sockaddr*)&sockaddr_inIdentifier, sizeof(sockaddr_inIdentifier))
Run Code Online (Sandbox Code Playgroud)
据我所知,这行代码打破了严格的别名规则(并且gcc给了我相同的警告).那么是否有一个计划b,在O3模式下使用套接字而不转向严格的数据?当然没有违反规定?或者我是否必须运行一个可以在所有系统/编译器上运行的套接字系统?
我正和朋友们开发一个网站.我正在编写服务器程序,我的HTML/CSS知识很低.
我从那个工作是HTML/CSS的人那里得到了一个页面,其中有一个看起来像这样的部分:
<div>
<form>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
这是据我所知(当我试图继承它时我注意到)没有很好的形成.
谷歌搜索后我才发现,格式不正确的HTML甚至都不会显示出来.
所以我向他询问了这个<div>问题,他只是粗鲁地说:"页面看起来像我们希望它看起来,不是吗?!"
他是对的,确实如此.
但是现在我问自己(我有点懦弱,因为我知道我是高级语言编码器,不尊重标准导致未定义的行为)看起来,他所谓的"它做我们想要的"每个浏览器都能解释一下吗?或者甚至我错了,这是允许的,因为一些CSS的东西?
或者他只是那种试图绕过的编码器,幸运的是,它看起来像我们想要的,他甚至不知道为什么会这样做?
也许我们不知道的一些浏览器甚至不会显示页面?
对不起,我的问题风格很糟糕,但我真的不知道如何提出问题,因为我不是真正的HTML/CSS.