我想初始化一个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程序:
#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和C++中所有头文件的列表?
当我正在构建一个库时,我收到的错误就像' tree.h not found'.我想这是C和C++中的标准头文件.这让我了解了所有头文件及其贡献的好奇心.
我有搜索的地方吗?
我正在使用Solaris Unix.
在我使用的几个编译器(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和最近才开始探索c99功能.我只有一个问题:如果我在我的程序中使用c99,c99标志gcc并将其与之前的c99库链接,我的程序是否会成功编译?
那么,我应该坚持旧的C89还是进化?
当你写作
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维基百科条目.据我所知,有三种不同版本的C被广泛使用:C89,C99和C11.我的问题涉及不同版本的源代码的兼容性.假设我要编写一个程序(在C11中,因为它是最新版本)并导入一个用C89编写的库.根据C11规范编译所有文件时,这两个版本是否能够正常工作?
问题1:较新版本的C即旧C版本的C99,C11超集?我认为,超集我的意思是,根据较新的C规范编译时,旧代码将编译时没有错误和相同的含义.
我刚才读到,//在C89和C99中有不同的含义.除了这个功能,还是C89的C99和C11超集?
如果问题1的答案是否定的,那么我又得到了2个问题.
如何将旧代码"移植"到新版本?有没有解释这个程序的文件?
使用C89或C99或C11更好吗?
感谢您的帮助.
编辑:将ISO C更改为C89.
我有一些代码与以下非常相似
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) 我有点困惑...
我有一个使用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) 这个问题可能有也可能没有,虽然我试图找到一个,但每个人的答案似乎只是指的是声明/原型.它们指定定义void foo() { }是相同的void foo(void) { },但我应该以哪种方式实际使用?在C89?在C99?我相信我应该开始使用void foo(void);我的原型声明,但如果我使用void或不使用定义,是否有任何区别?
我正在研究用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扩展吗?