Tag: c99

返回C中布尔表达式的值

由于不值得一提的原因,我想知道布尔表达式是否有标准的定义值。 例如 int foo () { return (bar > 5); } 上下文是我担心我们的团队将TRUE定义为不同于1的东西,我担心有人会这样做: if (foo() == TRUE) { /* do stuff */ } 我知道最好的选择就是做 if (foo()) 但你永远不知道。 布尔表达式是否有定义的标准值,还是由编译器决定? 如果有的话,标准值是否包含在C99中? 怎么样C89?

为什么包装不适用于兄弟工会或结构

在下面的例子中,我希望complex_t的大小与uint16_t相同:2个字节,但它是3个字节。 删除第二个联合(“proximity_unsafe”)会将大小减小到2个字节,但我无法弄清楚打包规则的模型。 #include #include typedef union { uint16_t unsafe; struct { uint16_t backwardmotion_unsafe : 1; uint16_t batteryvoltage_unsafe : 1; union { uint16_t dropoff_unsafe : 4; struct { uint16_t dropofffrontleft_unsafe : 1; uint16_t dropofffrontright_unsafe : 1; uint16_t dropoffsideleft_unsafe : 1; uint16_t dropoffsideright_unsafe : 1; }__attribute__((__packed__)); }__attribute__((__packed__)); union { uint16_t proximity_unsafe : 3; struct { uint16_t proximityfront_unsafe […]

具有静态存储持续时间的常量对象和相等的常量初始化器是否可以合并?

考虑两个具有静态存储持续时间和相等的常量初始化器的对象: static const int a = 50; static const int b = 50; 编译器是否有效组合这些&a == &b ? (对于上下文,我考虑使用静态常量对象来获取唯一地址以用作标记指针值。如果编译器合并这些对象是合法的,并且我对两个这样的对象使用相同的常量值,那么地址可以是平等的,我不能用它们作为哨兵价值。)

C99的固定宽度整数类型

在这里没有得到我的问题的详细答案。 我想我会从另一个角度解决它。 有人能够解释用于确定C99固定宽度整数类型的基础类型的选择标准: [u]int_fast[n]_t [u]int_least[n]_t [u]int[n]_t 对于给定的处理器,如果’long’和’int’的大小相同(sizeof(int)== sizeof(long)),那么为什么’long’会在’int’上使用,反之亦然。

这种有效类型规则的使用是否严格符合?

C99和C11中的有效类型规则规定,可以使用任何类型写入没有声明类型的存储,并且存储非字符类型的值将相应地设置存储的有效类型。 撇开INT_MAX可能小于123456789的事实,以下代码对有效类型规则的使用是否严格符合? #include #include /* Performs some calculations using using int, then float, then int. If both results are desired, do_test(intbuff, floatbuff, 1); For int only, do_test(intbuff, intbuff, 1); For float only, do_test(floatbuff, float_buff, 0); The latter two usages require storage with no declared type. */ void do_test(void *p1, void *p2, int leave_as_int) { *(int*)p1 […]

_Bool数据类型为C99

C编程语言的C99标准将_Bool数据类型定义为另一种数据类型的宏(因为该语言无法处理类型安全布尔值)。 _Bool是unsigned char , unsigned int或其他一些数据类型的宏吗?

gcc(windows + MinGW)是否在inttypes.h中定义了SCNd8,SCNu8?

#include #include int main(void) { int8_t int8; int16_t int16; int32_t int32; int64_t int64; uint8_t uint8; uint16_t uint16; uint32_t uint32; uint64_t uint64; scanf(“%”SCNd8″%”SCNd16″%”SCNd32″%”SCNd64″%”SCNu8″%”SCNu16″%”SCNu32″%”SCNu64, &int8, &int16, &int32, &int64, &uint8, &uint16, &uint32, &uint64); printf(“%”PRId8″\n%”PRId16″\n%”PRId32″\n%”PRId64″\n%”PRIu8″\n%”PRIu16″\n%”PRIu32″\n%”PRIu64″\n”, int8, int16, int32, int64, uint8, uint16, uint32, uint64); return 0; } 我无法使用最新的gcc + MinGW + Netbeans + Windows编译此代码。 Netbeans说“无法解析标识符SCNd8和SCNu8”。 我在gcc手册页上找不到SCNd8和SCNu8的任何参考,尽管http://linux.die.net/include/inttypes.h定义了它们。 我没有收到使用PRId8或PRIu8的语法错误。 MinGW inttypes.h(缺少SCNd8和SCNu8)(示例代码) #define […]

C99中是否有固定尺寸的浮动和双重类型?

C99表示整数类型,如uint32_t,int16_t等,其中很容易看到使用的位数。 很高兴知道嵌入式编程。 我没有找到浮点值的任何类似类型。 有标准吗? 如果没有,为什么?

C中的隐含声明

以下程序是否在C中调用Undefined Behaviour ? int main() { printf(“Printf asking: Where is my declaration ?”); } 在上面的程序中有一个printf()的隐式声明,上面的代码是完全符合标准的,还是只有一些特定于实现的行为?

我可以在中间而不是结尾使用__VA_ARGS定义可变参数C预处理器宏吗?

如果我这样做,海湾合作委员会会抱怨: #define M(obj,met, …, contents) obj##_##met(const void * self, __VA_ARGS__) { \ contents \ } 给我这两个理由: error: missing ‘)’ in macro parameter list warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro 显然,C99样式的可变参数宏在省略号之后立即期望右括号,有效地要求可变参数列表是宏的最后一个参数。 我需要它在中间来产生我在上面的宏中描述的速记符号。 GCC是否支持此function,使用另一种(非C99)可变参数宏样式? 我可以模仿它在其他地方做吗? 我最后不想要可变列表,它会让我的符号混乱。 我只能使用GCC。