Tag: c99

为什么在C中的等式表达式中不允许使用结构?

结构体作为比较操作数的不可用性是C中比较明显的事情之一(对我而言)没有多大意义。 结构可以通过值传递并通过赋值复制,但是没有为它们指定== 。 下面是C11标准(草案)的相关部分,它们定义了相等运算符( ==和!= )和简单赋值运算符( = )的约束。 注意在等式运算符的约束中缺少结构和联合。 (除了缺乏处理_Atomic ,C99中的措辞是相同的)。 6.5.9平等运营商 约束 以下其中一项应持有: 两个操作数都有算术类型; 两个操作数都是指向兼容类型的限定或非限定版本的指针; 一个操作数是指向对象类型的指针,另一个是指向void的限定或非限定版本的指针; 要么 一个操作数是一个指针,另一个是空指针常量。 6.5.16.1简单分配 约束 以下其中一项应持有: 左操作数具有primefaces,限定或非限定算术类型,右边有算术类型; 左操作数具有与右侧类型兼容的结构或联合类型的primefaces,限定或非限定版本; 左操作数具有primefaces,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有全部右边指出的类型的限定词; 左操作数具有primefaces,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的指针void,左边指向的类型具有右边指向的所有类型的限定符; 左操作数是一个primefaces,限定或非限定指针,右边是一个空指针常量; 要么 左操作数的类型为atomic,qualified或nonqualified _Bool,右边是指针。 任何人都可以解释为什么存在这种差异(没有推测)?

有没有理由说C99不支持函数重载?

显然(至少根据gcc -std=c99 )C99不支持函数重载。 在C中不支持某些新function的原因通常是向后兼容,但在这种情况下,我无法想到函数重载会破坏向后兼容性的单一情况。 不包括这个基本function的原因是什么?

C预处理器使用父宏的右括号

我有这个代码有效: #include #define A(x) x B #define B(x) C(x, #define C(x,y) yx) int main( void ) { printf( A(“1”) (“2”) “3” ); } 它打印132 ( A宏的点是交换括号中跟随其参数的东西,之后的所有内容,直到另一个结束括号) 但如果我在另一个宏中使用它: #define Z(x) x printf( Z( A(“1”) (“2”) “3” ) ); 我得到编译错误“未终止的函数式宏调用”。 我意识到这是因为编译器试图独立处理Z的参数,但我需要使用它的右括号作为标记。 有没有办法让我在宏中工作? 更改调用语法实际上不是一个选项。 ps在我得到任何回复谈论这是多么糟糕的事情之前,请放心:这不是真正的代码。 制作玩具程序时出现了一个问题,该程序使用define来模拟C语言中的新语言。

令牌贴在C中

看完VA_NARG后 我尝试使用宏根据C中的参数数量实现函数重载。 现在的问题是: void hello1(char *s) { … } void hello2(char *s, char *t) { … } // PP_NARG(…) macro returns number of arguments :ref to link above // does not work #define hello(…) hello ## PP_NARG(__VA_ARGS__) int main(void) { hello(“hi”); // call hello1(“hi”); hello(“foo”,”bar”); // call hello2(“foo”,”bar”); return 0; } 我从C-faq那里读到了这个 。 但仍然无法让它工作……

使用数组限制?

有没有办法告诉C99编译器我要访问给定数组的唯一方法是使用myarray [index]? 说这样的话: int heavy_calcualtions(float* restrict range1, float* restrict range2) { float __I promise I won’t alias this__ tmpvalues[1000] = {0}; …. heavy calculations using range1, range2 and tmpvalues; …. } 通过使用restrict我承诺我不会为range1和range2设置别名但是如何为我的函数内部声明的数组做同样的事情?

函数调用之间是否刷新了全局变量?

我正在编写嵌入式固件,并发现有时很难确定何时需要使用volatile。 当我有一个等待某个布尔标志被中断改变的函数时,很明显该标志需要是易失性的,因为该函数会永远等待,因为编译器没有意识到该值可以由打断。 但是当我有一个只检查第一行中的标志的短函数时,我希望标志不需要是易失性的,因为每次进入函数时它的值都会被读取? 所以当一个中断在我第一次调用函数和第二次调用函数之间修改它的值时,我将获得最新的值。 或者是否无法保证每次进入该function时都会清除所有缓存寄存器?

内联函数的前向声明

我有一个头文件,将包含大量(30+)内联函数。 我没有让读者滚动或搜索内联函数的定义(实现),而是希望有一个前向声明部分,它声明函数声明以及描述函数的注释。 本节将允许读者了解如何使用函数或查找函数,而无需向下滚动到实现。 此外,我希望读者养成使用函数的习惯,而不必看到他们的实现。 独立函数的前向声明的语法是什么? {这适用于C99和C ++} 仅供参考,我使用IAR Workbench C编译器设置使用C99。

主要编译器/工具链中C99支持的状态是什么?

对我在这里做出的评论的回应让我停下来思考:“我真的不知道C99支持的状态是什么。” 维基百科提供了一些编译器的详细信息,但我对C99不太熟悉,无法了解标准的所有部分内容,因此我正在寻找格式塔概述的问题答案: 主要编译器/工具链中C99支持的状态是什么?

如何定义外部变量和声明?

维基说: extern关键字表示“声明而不定义”。 换句话说,它是一种显式声明变量或强制声明而无需定义的方法。 也可以明确定义变量,即强制定义。 这是通过为变量分配初始化值来完成的 。 这意味着, 初始化变量的extern声明用作该变量的定义 。 所以, /* Just for testing purpose only */ #include extern int y = 0; int main(){ printf(“%d\n”, y); return 0; } 应该是有效的( 在C ++ 11中编译 )。 但是当在GCC 4.7.2中使用选项-Wall -Wextra -pedantic -std=c99进行编译时,会产生一个警告: [Warning] ‘y’ initialized and declared ‘extern’ [enabled by default] 哪个不应该。 据我所知, extern int y = […]

在-255到255范围内,signed char溢出是否未定义?

根据GCC在C99模式下,以下代码是未定义的行为: signed char c = CHAR_MAX; // assume CHAR_MAX < INT_MAX c = c + 1; printf("%d", c);