小编Lun*_*din的帖子

如何在Code :: Blocks中使用C11标准

就像标题所说,我需要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

c codeblocks c11 gcc5.2

4
推荐指数
1
解决办法
1万
查看次数

为什么它以十六进制表示法显示?

我试图做变量位算术ab.当我反转时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)

c

4
推荐指数
1
解决办法
128
查看次数

什么是"误报"?

我注意到以下关于理解严格别名的代码:

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)

c gcc compiler-warnings gcc-warning

4
推荐指数
1
解决办法
1413
查看次数

我们在嵌入式c或嵌入式c ++中有'@'运算符吗?如果是,请解释下面的代码?

码:

static volatile unsigned char   TMR0    @ 0x01;

static volatile unsigned char   PORTA   @ 0x05;

static volatile unsigned char   PORTB   @ 0x06;

static volatile unsigned char   PORTC   @ 0x07;
Run Code Online (Sandbox Code Playgroud)

此代码来自PIC16F877A的HT-PICC编译器pic.h库文件

我理解静态volatile和其他关键字的含义.这里Timer0的寄存器地址是0x01,但为什么它们@在它前面使用呢?它与指针有关吗?

c embedded pic hi-tech-c

4
推荐指数
1
解决办法
191
查看次数

哪一个更安全?"== TRUE"或"!= FALSE"

将布尔类型变量与以下内容进行比较是否更好:

  1. == FALSE!= FALSE; 要么
  2. == TRUE!= TRUE

c boolean

4
推荐指数
1
解决办法
132
查看次数

如何在 Visual Studio 中包含头文件和源文件文件夹

我正在使用 Visual Studio (2017),我需要以下内容。

我有一个文件夹,代码生成器在其中放置了从正式模型获得的 .h 和 .c 文件。这个文件夹不是我控制的,比如我不能在里面写,但它是由另一个团队成员更新的。

通过使用 /I 编译器选项(或项目属性中的其他包含目录),我设法在我的 VS 项目中导入了所有生成的头文件。我应该做的是将这个生成的代码集成到一个特定的平台,这意味着我必须在目标平台上编译生成的代码和集成代码。问题是,编译器无法解析生成代码的生成函数定义,因为它只能看到 .h 文件。我得到的是链接错误(外部符号未解析)

为了解决这个问题,我手动添加了现有的.c文件,一一添加。此解决方案带来的明显问题是

  • 手工钻孔工作
  • 生成新文件时,我需要手动导入新文件

问题是:有没有可以设置的选项来指定源文件的路径而不是一一传递?

注意:仅将生成的代码复制并粘贴到 VS 项目文件夹中是不可接受的解决方案。

谢谢

c visual-studio

4
推荐指数
1
解决办法
2495
查看次数

内存顺序在 C11 中消耗使用量

我读过有关携带依赖关系和依赖关系排序之前,在其定义中使用一个5.1.2.4(p16)

在以下情况下,评估A在评估之前是依赖顺序的B

A对原子对象执行释放操作M,并在另一个线程中B执行消耗操作M并读取以 为首的释放序列中的任何副作用写入的值A,或

— 对于某些求值XA之前是依存顺序XX带有对 的依存关系B

所以我试图制作一个可能有用的例子。就这个:

static _Atomic int i;

void *produce(void *ptr){
    int int_value = *((int *) ptr);
    atomic_store_explicit(&i, int_value, memory_order_release);
    return NULL;
}

void *consume(void *ignored){
    int int_value = atomic_load_explicit(&i, memory_order_consume);
    int new_int_value = int_value + 42;
    printf("Consumed = %d\n", new_int_value);
}

int main(int …
Run Code Online (Sandbox Code Playgroud)

c multithreading c11 stdatomic

4
推荐指数
1
解决办法
896
查看次数

为什么会出现“从不兼容类型'void *'“分配给'int *'错误?

我在codeacademy上学习c,并且从不兼容的类型“ void *”错误中分配了“ int *”。我的文件是一个.c文件,其中包括stdlib.h。我不理解该错误,似乎更正使用了相同的代码行。

我正在尝试使用malloc创建一个数组。

我试图找到其他主题的答案。看来malloc并不是做到这一点的最佳方法,但我想找到一种使它起作用的方法。

我在Mac上,我使用emacs进行编码和gcc进行编译。

这是我的代码的一部分:

int main(int argc, char *argv[])
{
  char mot_secret[] = "PISCINE";
  int nombre_lettres = strlen(mot_secret);
  int *pnombre_lettres = &nombre_lettres;
  int *decouverte = NULL;
  int compteur = 10;

  decouverte = malloc(nombre_lettres * sizeof(int));
  if (decouverte == NULL)
    {
      exit(0);
    }

Run Code Online (Sandbox Code Playgroud)

这是解决方案:(我尝试翻译一些变量)

int main(int argc, char* argv[])
{
    char lettre = 0;
    char secretword[100] = {0};
    int *lettreTrouvee = NULL; 
    long coupsRestants = 10; // Compteur de coups restants (0 …
Run Code Online (Sandbox Code Playgroud)

c gcc

4
推荐指数
2
解决办法
121
查看次数

sizeof()具有零长度数组成员的结构

我对sizeof()C语言的输出感到困惑。说我有:

struct foo {
    char a;
    char b;
    char c;
    char d[0];
};
Run Code Online (Sandbox Code Playgroud)

我希望sizeof(struct foo)是4。但是,用gcc编译后返回3。另外,在使用严格的设置编译代码时-pedantic-errors,会出现编译器错误。

有人可以帮助我了解这种行为吗?

c gcc sizeof c99 flexible-array-member

4
推荐指数
1
解决办法
106
查看次数

内存中的 BSS 与 DATA 段

//Global space
int A;
int B = 0;
int C = 0x01;
static int D;
static int E = 0;
static int F = 0x01;

void foo()
{
    static int G;
    static int H = 0;
    static int I = 0x01;
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,所有未显式初始化或初始化为 0 的全局变量和静态变量都将进入 BSS 部分。所有使用 0 以外的值初始化的全局变量和静态变量都将进入 DATA 部分。我对吗?

在这种情况下,以下内容是正确的。

A -- BSS (No Explicit init)
B -- BSS (init to 0)
C -- DATA (!= 0)
D -- BSS
E -- BSS
F -- DATA
G -- …
Run Code Online (Sandbox Code Playgroud)

c memory embedded

4
推荐指数
1
解决办法
2970
查看次数