根据C99,以下代码是否合法?
...
for(....) {
int x = 4;
...
}
...
Run Code Online (Sandbox Code Playgroud)
您可以假设在第3行之前,变量x从未声明过.
到目前为止我只发现了以下内容,但我认为这还不够:
块允许将一组声明和语句分组为一个语法单元.具有自动存储持续时间的对象的初始化程序和具有块作用域的普通标识符的可变长度数组声明符将被评估,并且每次声明时,值都存储在对象中(包括在没有初始化程序的对象中存储不确定值)按执行顺序到达,就好像它是一个语句,并在声明符出现的顺序中的每个声明中.
从该PDF的第145页开始.
C99标准将其描述为:
整数和实数浮点类型统称为实数类型.
整数和浮点类型统称为算术类型.
这是否意味着他们在C中是一回事?或者他们之间有什么不同?
我想在编译期间添加一条警告消息,警告用户它应该使用gnu99而不是c99(我使用的是匿名结构,而且它似乎在c99中根本不存在).
我找到:
#if __STDC_VERSION__ >= 199901L
Run Code Online (Sandbox Code Playgroud)
但是这个测试适用于c99和gnu99.
我可以使用哪个预定义的宏?
我正在查看由名为OVP的公司(类似于qemu的产品)提供的"处理器建模指南".在其中,有一个类似于以下内容的小代码片段:
static or1kDispatchTableC dispatchTable = {
// handle arithmetic instructions
[OR1K_IT_ADDI] = disDefault,
[OR1K_IT_ADDIC] = disDefault,
[OR1K_IT_ANDI] = disDefault,
[OR1K_IT_ORI] = disDefault,
[OR1K_IT_XORI] = disDefault,
[OR1K_IT_MULI] = disDefault
};
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这样的语法. 删除了关于C++的无关紧要的东西
目前我没有能力下载/查看他们的东西,看看有什么定义,因此我的问题.如果你认识到这种语法,你能说出来吗?
编辑
or1kDispatchTableC是类型指针的typedef or1kDispatchTableCP,但我仍然没有任何东西or1kDispatchTableCP.
的逗号序列操作者引入了一个顺序点的表达式中.我想知道这是否意味着下面的程序避免了未定义的行为.
int x, y;
int main()
{
return (x++, y) + (y++, x);
}
Run Code Online (Sandbox Code Playgroud)
如果它确实避免了未定义的行为,它仍然可能未指定,即返回几个可能值中的一个.我认为在C99中,它只能计算1,但实际上,各种版本的GCC将此程序编译成可返回的可执行文件2.Clang生成一个返回的可执行文件1,显然与我的直觉一致.
最后,这是C11改变了吗?
因为在CI中可以通过名称调用结构的成员(myStruct.myMember =),我想知道在C++中我将使用那些未初始化的成员做什么.据我所知,C++不支持这种初始化:
static struct usb_endpoint_descriptor fs_source_desc = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bmAttributes = USB_ENDPOINT_XFER_BULK,
.wMaxPacketSize = __constant_cpu_to_le16 (64),
};
Run Code Online (Sandbox Code Playgroud)
但是当我使用正确的语法时,如何处理未初始化的成员?让我们说我想要bDescriptorType未初始化.我将它设置为NULL吗?
static struct usb_endpoint_descriptor fs_source_desc = {
USB_DT_ENDPOINT_SIZE,
NULL,
USB_ENDPOINT_XFER_BULK,
__constant_cpu_to_le16 (64)
};
Run Code Online (Sandbox Code Playgroud)
或者,在C++中是否有任何方法可以按名称初始化结构的成员?
for(int i=0; i<len_arr; i++)
if(arr[i] == some_num){
printf("The idx of %d is: %d\n", some_num, i);
break;
}
if(i == len_arr)
printf("Number not found.\n");
Run Code Online (Sandbox Code Playgroud)
这不起作用.因为i无法在循环外访问.
我想到了两种方法来实现我想要的效果.
但我的问题是,还有其他更优雅的方法来做这个效果吗?
方式1:
int i;
for(i=0; i<len_arr; i++)
if(arr[i] == some_num){
printf("The idx of %d is: %d\n", some_num, i);
break;
}
if(i == len_arr)
printf("Number not found.\n");
Run Code Online (Sandbox Code Playgroud)
方式2:
for(int i=0; (i<len_arr) && (printf("Number not found.\n")); i++)
if(arr[i] == some_num){
printf("The idx of %d is: %d\n", some_num, i);
break;
}
Run Code Online (Sandbox Code Playgroud) 我想从RenderScript中的一个Allocation访问更多元素.我们来自Google的示例代码:
uchar4 __attribute__((kernel)) invert(uchar4 in, uint32_t x, uint32_t y) {
uchar4 out = in;
out.r = 255 - in.r;
out.g = 255 - in.g;
out.b = 255 - in.b;
return out;
}
Run Code Online (Sandbox Code Playgroud)
它需要一个uchar4,谁是分配的一个元素.是否可以访问和操作多个元素?就像展开一个循环一样,例如,来自Bitmap的8个像素.
谢谢.
我尝试将signed int分配给unsigned int.
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%d", &a);
b = a;
printf("%d %u\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望编译它会导致警告我将一个int值赋给unsigned int变量.但我没有得到任何警告.
$ gcc -std=c99 -Wall -Wextra -pedantic foo.c
$ echo -1 | ./a.out
-1 4294967295
Run Code Online (Sandbox Code Playgroud)
接下来,我尝试将unsigned int分配给signed int.
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%u", &b);
a = b;
printf("%d %u\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
仍然没有警告.
$ gcc -std=c99 -Wall -Wextra -pedantic bar.c
$ echo 4294967295 | ./a.out
-1 …Run Code Online (Sandbox Code Playgroud) 我正在使用支持C99子集的自定义gcc编译器编写一些代码.使用编译器选项我定义了一个像这样的宏:
ENABLE_LOGGING=true
Run Code Online (Sandbox Code Playgroud)
我在我的代码中使用它,如下所示:
#if ENABLE_LOGGING
#define LOG(foo) { log(foo); }
#else
#define LOG(foo)
#endif
Run Code Online (Sandbox Code Playgroud)
事实证明,这不能可靠地运作.有时使用LOG包含代码,有时使用emtpy LOG(相同的项目,相同的编译器设置).
将宏参数更改为:
ENABLE_LOGGING=1
Run Code Online (Sandbox Code Playgroud)
一切正常.
据我所知,true预处理器可能不知道.但是,为什么它最常用?为什么在编译它不起作用的模块时,我没有得到任何警告或错误?