相关疑难解决方法(0)

如何根据C编程语言标准初始化结构

我想初始化一个struct元素,在声明和初始化中拆分.这就是我所拥有的:

typedef struct MY_TYPE {
  bool flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}
Run Code Online (Sandbox Code Playgroud)

这是MY_TYPE根据C编程语言标准(C89,C90,C99,C11等)声明和初始化局部变量的方法吗?或者有什么更好或至少工作?

更新我最终得到一个静态初始化元素,我根据自己的需要设置每个子元素.

c struct initialization

435
推荐指数
10
解决办法
73万
查看次数

当在C89模式下编译时,以下程序如何输出`C89`和在C99模式下编译时输出`C99`?

我从网上找到了这个C程序:

#include <stdio.h>

int main(){

    printf("C%d\n",(int)(90-(-4.5//**/
    -4.5)));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序的有趣之处在于,当它在C89模式下编译和运行时,它会打印C89,当它被编译并在C99模式下运行时,它会打印出来C99.但我无法弄清楚这个程序是如何工作的.

你能解释一下第二个参数如何printf在上面的程序中起作用吗?

c printf comments c99 c89

125
推荐指数
3
解决办法
5605
查看次数

C和C++中的标准头文件列表

我在哪里可以找到C和C++中所有头文件的列表?

当我正在构建一个库时,我收到的错误就像' tree.h not found'.我想这是C和C++中的标准头文件.这让我了解了所有头文件及其贡献的好奇心.

我有搜索的地方吗?

我正在使用Solaris Unix.

c c++ header-files

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

ANSI C与其他C标准

在我使用的几个编译器(gcc除了各种版本之外的所有版本)中,我得到一个C99 mode错误,例如int i在for循环表达式中而不是在它之前声明(如果我不使用该std=c99选项).在这里阅读之后,我理解gcc选项-ansi,-std=c89并且-std=iso9899:1990都评估为ANSI C标准,但我不明白为什么/如果我应该选择c89标准而不是更新的标准c99(这是我假设的最新标准).

此外,我看到isoC语言的类型标准的多个版本,其中第一个(根据我的理解)是ANSI标准的直接端口. 是否可以肯定地说iso将更新他们的C标准,但C的原始ANSI标准将始终是相同的?

奖金问题:

我实际上可以自己弄清楚这一点,我还没有花时间去做,所以如果有人知道他们的头顶那么这很好,否则没什么大不了的,我以后会搞清楚的:)

我有一本相当新的书The C Programming Language (ANSI).我的书总是显示像这样的循环:

int i;

for(i = 0; i < foo; i++)
Run Code Online (Sandbox Code Playgroud)

但很多人(他们的小指中有大多数编程才能)都会像这样编写for循环:

(int i = 0; i < foo; i++)
Run Code Online (Sandbox Code Playgroud)

如果我以第一种方式编写循环然后i应该可以访问整个函数是正确的,但是如果我以第二种方式编写它,那么i只能访问for循环REGARDLESS我编译的标准是什么?另一种问同样问题的方法,如果我使用c89标准进行编译,那么ifor循环的两个for循环都可以被整个函数访问,如果我使用c99标准进行编译,i那么整个函数可以访问第一个for循环i.第二个for循环只能通过for循环访问?

c gcc ansi-c

30
推荐指数
2
解决办法
2万
查看次数

C99是否与C89向后兼容?

我习惯了旧式C和最近才开始探索c99功能.我只有一个问题:如果我在我的程序中使用c99,c99标志gcc并将其与之前的c99库链接,我的程序是否会成功编译?

那么,我应该坚持旧的C89还是进化?

c c99

15
推荐指数
2
解决办法
4032
查看次数

初始化位域

当你写作

struct {
    unsigned a:3, b:2;
} x = {10, 11};
Run Code Online (Sandbox Code Playgroud)

x.b保证是3由ANSI C(C89)?我已阅读并重新阅读标准,但似乎无法找到确切的情况.

例如,"无法用结果无符号整数类型表示的结果以模数的形式减少,该数字大于可由结果无符号整数类型表示的最大值." 谈论计算,而不是初始化.而且,位字段实际上不是一种类型.

此外,(当谈到无符号t:4时)"包含[0,15]范围内的值",但这并不一定意味着初始化器必须以模16减少以映射到[0,15].

结构初始化真的是详细描述,但我似乎无法找到确切的行为.(当然编译器就是这样做的.而且IBM文档说"当你将一个超出范围的值分配给一个位字段时,保留低位模式并分配适当的位.",但是我想要要知道ANSI C是否标准化了.

c struct initialization ansi bit-fields

10
推荐指数
2
解决办法
7806
查看次数

C89/C90,C99和C11的兼容性

我刚才读到:C维基百科条目.据我所知,有三种不同版本的C被广泛使用:C89,C99和C11.我的问题涉及不同版本的源代码的兼容性.假设我要编写一个程序(在C11中,因为它是最新版本)并导入一个用C89编写的库.根据C11规范编译所有文件时,这两个版本是否能够正常工作?

问题1:较新版本的C即旧C版本的C99,C11超集?我认为,超集我的意思是,根据较新的C规范编译时,旧代码将编译时没有错误和相同的含义.

我刚才读到,//在C89和C99中有不同的含义.除了这个功能,还是C89的C99和C11超集?

如果问题1的答案是否定的,那么我又得到了2个问题.

  1. 如何将旧代码"移植"到新版本?有没有解释这个程序的文件?

  2. 使用C89或C99或C11更好吗?

感谢您的帮助.

编辑:将ISO C更改为C89.

c iso c99 c89 c11

9
推荐指数
1
解决办法
6168
查看次数

如何在不命名的情况下访问union的成员?

我有一些代码与以下非常相似

struct T {
    union {
        unsigned int x;
        struct {
            unsigned short xhigh;
            unsigned short xlow;
        };
    } x;
    /* ...repeated a handful of times for different variables in T... */
};
Run Code Online (Sandbox Code Playgroud)

这完全符合您的期望:它允许我声明一个类型的变量struct T并访问t.x.x或者t.x.xhigh或者t.x.xlow.到现在为止还挺好.

但是,我真的很喜欢它,如果我只是t.x在想要访问union的值作为unsigned int数量的常见情况下,但保留独立访问高阶和低阶部分的能力,而无需借助于位屏蔽和转移,而不调用未定义的行为.

这可能在C?

如果可能,那么声明的C语法是什么?

当我尝试简单访问的naiive方法t.x而不是t.x.x,我收到警告消息(这个特定的一个来自一个printf()调用):

cc -ansi -o test -Wall test.c
test.c: In function ‘my_function’:
test.c:13:2: warning: format ‘%X’ expects argument of type ‘unsigned int’, but …
Run Code Online (Sandbox Code Playgroud)

c unions

3
推荐指数
1
解决办法
183
查看次数

STM32 HAL C标准

我有点困惑...

我有一个使用STM32 HAL库的嵌入式项目,该库又使用了stm32f072rb CMSIS头文件。

HAL 在这里声称它是严格的ANSI-C

The source code of drivers is developed in Strict ANSI-C, which makes it
independent from the development tools. It is checked with CodeSonarTM static
analysis tool. It is fully documented and is MISRA-C 2004 compliant.
Run Code Online (Sandbox Code Playgroud)

我相信严格的ANSI-C意味着C89,所以我将这些gcc标志添加到了我的Makefile中。

CFLAGS =            -std=c89\
                    -pedantic-errors
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,会给出很多错误和警告。如果删除这些标志,它将进行编译。

我对此感到非常困惑。我是否缺少某些东西或他们的文档有误?

这是一些启用了该标志的gcc编译器错误...它们在许多STM32 HAL文件中不断重复。

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
error: unknown type name 'inline'
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'NVIC_GetPriority'
Run Code Online (Sandbox Code Playgroud)

c gcc hal stm32 c89

3
推荐指数
1
解决办法
770
查看次数

在C中,我应该定义(不声明/原型)一个不带void参数或空列表的函数吗?

这个问题可能有也可能没有,虽然我试图找到一个,但每个人的答案似乎只是指的是声明/原型.它们指定定义void foo() { }是相同的void foo(void) { },但我应该以哪种方式实际使用?在C89?在C99?我相信我应该开始使用void foo(void);我的原型声明,但如果我使用void或不使用定义,是否有任何区别?

c

1
推荐指数
2
解决办法
1341
查看次数

是(int i = 0 ... gnu扩展名的形式?

我正在研究用fortran编写的计算软件,但我在C中开发了一个小扩展.软件必须具有高可移植性,除了其他限制之外,还必须在GCC套件和英特尔编译器套件上进行编译.我通常在GCC上测试,一切顺利,直到我尝试使用intel套件进行编译.我在一个简单的for循环中得到了"预期的表达式"错误.我创建了一个最小的测试用例,似乎icc拒绝在for循环头内编译变量的声明.

#include <stdio.h>

int main(int argc, char** argv){
    for(int i = 0; i < 5; i++){
        printf("%d\n", i);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给了我关于英特尔13,15,16,17和18(但不是19)的以下内容

$ icc test.c -o ./test
test.c(4): error: expected an expression
    for(int i; i < 5; i++){
        ^

test.c(4): error: identifier "i" is undefined
    for(int i; i < 5; i++){
               ^

compilation aborted for test.c (code 2)
Run Code Online (Sandbox Code Playgroud)

我不是C专家,但我看过这种形式已有数千次,GCC从未出现问题.这是英特尔最近采用的GNU扩展吗?

c gcc icc

0
推荐指数
1
解决办法
89
查看次数

标签 统计

c ×11

c89 ×3

c99 ×3

gcc ×3

initialization ×2

struct ×2

ansi ×1

ansi-c ×1

bit-fields ×1

c++ ×1

c11 ×1

comments ×1

hal ×1

header-files ×1

icc ×1

iso ×1

printf ×1

stm32 ×1

unions ×1