Tag: c99

是否有预处理器宏来检测跨平台的C99?

C ++有一个__cplusplus预处理器定义,可以让你检测版本。 C有什么相似之处吗? 我希望它可以在XCode,GCC和Visual Studio版本中移植。

是否允许/定义零长度可变长度数组?

我在C99编程并在我的代码的一部分中使用可变长度数组。 我知道在C89中不允许使用零长度数组,但我不确定C99和可变长度数组。 简而言之,以下是明确定义的行为吗? int main() { int i = 0; char array[i]; return 0; }

是否存在支持负零的任何实现,或将其保留为陷阱表示?

在当前和年龄的大多数实现中,符号位的位模式为1且值位为0的有符号整数值往往表示该有符号整数类型的最低可能值。 但是,如6.2.6.2p2所述,这不是一项要求: 这些适用中的哪一个是实现定义的,就像符号位1和所有值位零(前两个),或符号位和所有值位1(对于补码)一样,是否为陷阱表示或正常值。 我的第一个问题很简单:是否有任何实现将此位模式用于负零或陷阱表示? 如果这个问题的答案是’不’,那么我后续问题的答案也必须是’不’。 继该问题之后, 6.2.6.2p3指出当为对象分配负零时,它可能(或可能不)转换为常规零: 未指定这些情况是否实际产生负零或正常零,以及当存储在对象中时负零是否变为正常零。 我的后续问题: 是否有任何实现使用陷阱表示而不是该位模式的负零? 是否有任何使用负零的实现存储为不同的值? 是否有任何使用负零的实现存储为常规零? 编辑澄清:我不是要求在一个系统中理论上可行的是什么,该系统使用补码,二进制补码或有符号整数的符号和幅度表示。 我可以在本问题前面引用的章节中找到(并且已经找到)这些信息。 我问的是实际做了什么 。

关于转换为整数常量表达式(在标准C中)

在标准C(我的意思是C99或C11)中,我们有所谓的整数常量表达式 ,它们是常量表达式,其操作数都是常量整数。 还有其他约束,以避免表达式中的逗号运算符。 但是,在某些特殊情况下,允许使用其他非整数对象(甚至是非常量对象)。 例如,如果将sizeof运算符应用于大小在转换时间中已知的对象,则允许将其作为整数常量表达式的一部分 (请注意, sizeof始终返回整数值)。 此外,有时也允许显式转换为整数类型。 标准C99建立以下规则: 标准C99,第6.6节(第6节): 整数常量表达式)应具有整数类型,并且只能具有整数常量,操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量。 标准C99 我的问题是: “浮动常数是演员的直接操作数”的确切含义是什么? 浮点常量类似于3.14e + 3,或者是0x2.11p-5。 也就是说,不是float类型的一般常量表达式,而只是浮点文字。 然后,我明白在上面的定义中只允许这样的事情: (int) 3.14 但是不允许涉及浮动文字的操作 。 这排除了以下情况: (int) -3.14 /* The minus sign is not part of the constant: it is an operator */ (int) (3.14) /* The parenthesis are an operator acting on the literal 3.14 */ […]

如何在Codeblocks10.05中进入C99模式?

我最近意识到在收到编译错误后我甚至都没有处于C99模式 ‘for’循环初始声明仅允许在C99模式下使用 我找到了一些关于如何通过快速搜索到达C99的建议,告诉我去Projects -> Properties…但是,它是灰色的,我不确定这是否是正确的解决方法(可能不可用,因为我的文件不是项目,它是一个普通的源文件)。 我也看到很多类似的问题说要启用C99模式,所以我查看了编译器标志菜单,但我看不到有关C99的任何信息。 我已经尝试过其他一些标志,比如In C Mode,支持所有的ISO C90程序……但是在我设置了这个标志后,我得到的错误比以前更多,只要编译器在main()中找到注释就会出现。 注意:请不要只是说在for循环之外初始化计数器。 更新:尝试使用gcc编译代码块之外时,我尝试了gcc -O2 -std=C99 filename.c ,但收到错误: 无法识别的命令行选项“-std = C99” 我使用64位Windows 7,CodeBlocks10.05和GNU gcc。

当p和q指向同一个对象时,“* p = ++(* q)”是否未定义?

在阅读了序列点之后,我了解到i = ++i是未定义的。 那么这段代码怎么样: int i; int *p = &i; int *q = &i; *p = ++(*q); // that should also be undefined right? 假设p和q的初始化取决于某些(复杂)条件。 并且他们可能像上面的情况一样指向同一个对象。 会发生什么? 如果未定义,我们可以使用哪些工具进行检测? 编辑:如果两个指针不应该指向同一个对象,我们可以使用C99限制吗? 这是“严格”的意思吗?

将bignum类型结构转换为人类可读字符串的有效方法是什么?

我有点问题。 为了增长我对C的了解,我决定尝试实现一个基本的bigint库。 bigint结构的核心是一个32位整数数组,因为它们适合寄存器而被选中。 这将允许我在数字之间进行操作,这些数字将以64位整数溢出(这也适合寄存器,因为我在x86-64上),并且我可以对结果的每个部分进行位移位。 我已经实现了基本的添加,并且为了测试它是否正常工作,我必须打印数组。 对于我自己的测试目的,如果我使用printf()并以hex输出每个数字就没问题。 我可以读到这很好。 但是,大多数人都读不懂hex。 由于数字存储在(基本上)基数2 ^ 32中,因此打印有点问题。 什么是转换到基数10的好方法? 编辑: 这不涉及知道如何从基数转换为基数,而是关于实现这一点的好方法。 我正在考虑用另一个基础制作另一个bigint并转换打印。

C99中的易失性语义

我遇到了一些我正在编写的低级代码的问题,我需要将对象用作volatile,但不一定是因为我希望将类型声明为volatile(出于可重用性的原因)。 但是,我可以定义指向结构的限定变体的指针,如以下段中所述。 struct x { int bar; }; struct x foobar; … volatile struct x *foo = &foobar; 现在foo实际上是指向该类型对象的指针: volatile struct x { volatile int x; }; 因为volatile适用于所有struct成员。 现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用波动性? struct x { struct y *bar; }; 指向x的易变实例然后将其视为: volatile struct x { struct y * volatile bar; }; 或作为: volatile struct x { volatile struct y […]

在C中,const变量是否保证在内存中是不同的?

说到字符串文字,C99标准说(6.4.5.6): 如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的。 如果程序试图修改此类数组,则行为未定义。 我找不到类似的警告或对const变量的明确保证。 可以在上下文中使用表达式&x == &y const int x=12; const int y=12; const int x=12; const int y=12; 评价为1 ? const变量和字符串文字怎么样(即使在32位little-endian平台上, &x == “\014\000\000″保证为0 )? 对于它的价值, 本博客文章中的 “字符串文字”部分给出了问题的背景。

ANSI C和ISO C之间有什么区别吗?

我知道C有ANSI标准和ISO标准。这两个标准之间有什么区别吗? 如果是这样,他们是什么? 如果没有差异那么有两个标准是什么意思?