在Dennis Ritchie的"C编程语言"一书中,在getopop函数中,他声明s [1] ='\ 0'为什么他会在索引1上结束数组?有什么意义和需要?
在后面的部分,他确实使用了数组的其他部分..
int getch(void);
void ungetch(int);
/* getop: get next character or numeric operand */
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.')
return c; /* not a number */
i = 0;
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect fraction …Run Code Online (Sandbox Code Playgroud) 就像标题所说,我需要code::blocks与之合作C11,我无法弄清楚如何去做.
我去了settings=> compiler settings=> Other options我添加-std=c11并尝试了-std=gnu11,两者似乎都没有用.
我编译gcc-5.2然后我更改了默认编译器(gcc-4.9)仍然没有结果.
当我尝试编译以下程序时:
#include<stdio.h>
int main(void){
int arr[] = {0,1,2,3,4};
for(int i=0;i<5;i++){
printf("%d ",arr[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
|6|error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode|
Run Code Online (Sandbox Code Playgroud)
但如果我在终端(ubuntu 15.04,64BIT,gcc-5.2)中这样做:
./install/gcc-5.2.0/bin/gcc5.2 program.c -o program
Run Code Online (Sandbox Code Playgroud)
似乎工作正常.
我的问题是,如何code::blocks与之合作c11?
我试图做变量位算术a和b.当我反转时a,其值为0xAF,结果显示为8位数.与其他显示为2位数的人不同.
我不知道为什么会发生这种情况,但是猜测它与%x显示方式和小端有关?
这是我的代码:
#include <stdio.h>
int main()
{
int a = 0xAF; // 10101111
int b = 0xB5; // 10110101
printf("%x \n", a & b); // a & b = 10100101
printf("%x \n", a | b); // a | b = 10111111
printf("%x \n", a ^ b); // a ^ b = 00011010
printf("%x \n", ~a); // ~a = 1....1 01010000
printf("%x \n", a << 2);// a << 2 = 1010111100
printf("%x …Run Code Online (Sandbox Code Playgroud) 我注意到以下关于理解严格别名的代码:
uint32_t
swap_words( uint32_t arg )
{
U32* in = (U32*)&arg;
uint16_t lo = in->u16[0];
uint16_t hi = in->u16[1];
in->u16[0] = hi;
in->u16[1] = lo;
return (in->u32);
}
Run Code Online (Sandbox Code Playgroud)
据作者说,
使用GCC 4.0编译时启用-Wstrict-aliasing = 2标志的上述源 将生成警告.这个警告是误报的一个例子.允许这种类型的强制转换,并生成相应的代码(见下文).清楚地记录了-Wstrict-aliasing = 2可能返回误报.
我想知道什么是误报,我应该在别名变量时注意它吗?
以下是上面提到的"适当的代码(见下文)",如果它是相关的:
-fstrict-aliasing -O3 -Wstrict-aliasing -std=c99在GNU C 4.0.0版(Apple Computer,Inc.build 5026)上编译(powerpc-apple-darwin8),
swap_words:
stw r3,24(r1) ; Store arg
lhz r0,24(r1) ; Load hi
lhz r2,26(r1) ; Load lo
sth r0,26(r1) ; Store result[1] = hi …Run Code Online (Sandbox Code Playgroud) 我尝试使用DMA通道使用SPI发送数据.当我在没有DMA的情况下发送一切都没问题,但是用DMA确实是错误的.当我调试我的程序时,SPI DR寄存器始终为0.我想使用dma循环模式一直发送我的数组.有我的代码GPIO INIT:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SPI_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(GPIO_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
GPIO_PinAFConfig(GPIOB, AF_PIN_SOURCE, GPIO_AF);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
Run Code Online (Sandbox Code Playgroud)
SPI INIT
SPI_I2S_DeInit(SPI1);
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
Run Code Online (Sandbox Code Playgroud)
DMA INIT:
DMA_InitTypeDef dma;
DMA_DeInit(DMA1_Channel1);
DMA_StructInit(&dma);
dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_PeripheralDataSize …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译一段包含_Noreturn的代码:
#ifndef SOMEHEADER_H
#define SOMEHEADER_H
#include <stdalign.h>
#include <stdbool.h>
#include <stdint.h>
extern struct s {
_Noreturn void (*somenoreturnfunc)(bool);
} svar;
#endif
Run Code Online (Sandbox Code Playgroud)
这给了我:
error: expected specifier-qualifier-list before '_Noreturn' 上:
_Noreturn void (*somenoreturnfunc)(bool);
所以我从这里尝试了这个建议:
#ifndef SOMEHEADER_H
#define SOMEHEADER_H
#include <stdalign.h>
#include <stdbool.h>
#include <stdint.h>
#include "noreturn.h"
extern struct s {
noreturn void (*somenoreturnfunc)(bool);
} svar;
#endif
Run Code Online (Sandbox Code Playgroud)
noreturn.h:
#ifndef NO_RETURN_H
#define NO_RETURN_H
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
#define noreturn _Noreturn
#elif defined(__GNUC__)
#define noreturn __attribute__((noreturn))
#else
#define noreturn
#endif
#endif …Run Code Online (Sandbox Code Playgroud) 我正在使用 Visual Studio (2017),我需要以下内容。
我有一个文件夹,代码生成器在其中放置了从正式模型获得的 .h 和 .c 文件。这个文件夹不是我控制的,比如我不能在里面写,但它是由另一个团队成员更新的。
通过使用 /I 编译器选项(或项目属性中的其他包含目录),我设法在我的 VS 项目中导入了所有生成的头文件。我应该做的是将这个生成的代码集成到一个特定的平台,这意味着我必须在目标平台上编译生成的代码和集成代码。问题是,编译器无法解析生成代码的生成函数定义,因为它只能看到 .h 文件。我得到的是链接错误(外部符号未解析)
为了解决这个问题,我手动添加了现有的.c文件,一一添加。此解决方案带来的明显问题是
问题是:有没有可以设置的选项来指定源文件的路径而不是一一传递?
注意:仅将生成的代码复制并粘贴到 VS 项目文件夹中是不可接受的解决方案。
谢谢
要提取无符号32位整数的高位字和低位字,并将每个字存储在单独的uint16_t变量中,我执行如下操作(nbr是无符号的32位整数):
uint16_t lower_word = (uint16_t) nbr & 0x0000FFFF; // mask desired word
uint16_t upper_word = (uint16_t) ((nbr & 0xFFFF0000) >> 16); // right-shift after masking
Run Code Online (Sandbox Code Playgroud)
显式转换为uint16_t是不必要的吗?还有什么其他更有效的方法,如果有的话,你建议获得所需的结果而不是这种方法吗?
我正在看此页面:https : //en.cppreference.com/w/c/language/operator_precedence
引起我注意的是,括号运算符的唯一描述是函数调用。这是否意味着该表达式x = a * (b+c)-(d*e)具有两个函数调用?
所以我的问题是:为什么在编译命令末尾需要“ -lpthread”?
为什么此命令起作用:
gcc -o name name.c -lpthread
Run Code Online (Sandbox Code Playgroud)
但这不会:
gcc -o name name.c
Run Code Online (Sandbox Code Playgroud)
我在我的C代码中使用了pthread.h库。
我已经在网上寻找一些答案,但并没有真正找到可以理解的答案