Tag: c99

C:如何使数组的大小动态化?

我从书中读到:«C Primer Plus»告诉我C99标准,可以使用如下的语法: int b=4; char a[b]; 但是当我把这段代码放入vs2013时,它告诉我“表达式必须有一个常量值”。 这本书错了吗? 或者有一些我不知道的关于vs2013的新function?

scandir的隐含声明; alphasort未声明

我正在尝试使用scandir打印当前目录中的文件列表。 当我尝试编译时,我收到以下错误和警告: warning: implicit declaration of function ‘scandir’ [-Wimplicit-function-declaration] error: ‘alphasort’ undeclared (first use in this function) note: each undeclared identifier is reported only once for each function it appears in 我包括 ,据我所知,应该定义scandir()和所有相关的函数。 我在代码中看不到任何错误: #include … int printFiles(){ struct dirent **nameList; int numOfFiles = scandir(“.”, &nameList, 0, alphasort); //TODO print file names return numOfFiles; } […]

如何更改VS的编译器?

我正在使用VS 2010.我已经更改了编译器C代码而不是C ++的设置。 它工作正常,但问题是MS编译器不支持C99标准,因此我正在寻找一个可以与VS 10一起使用的C编译器。如何做到这一点? 提前致谢。

在运行时设置数组大小

我知道如何在函数内创建结构数组: typedef struct item { int test; }; void func (void) { int arraysize = 5; item ar[arraysize]; } 但是,当全局声明数组时,我该怎么做? typedef struct item { int test; }; item ar[]; void func (void) { int arraysize = 5; // What to here? }

重新分配数组(C99)

该标准指定如果新大小(如果更大),则重新分配空间的内容是未定义的。 如果保留先前分配的空间的内容很重要,那么重新分配数据的最佳方法如下:将其复制到堆栈,从堆中释放它,在堆上分配更多空间,然后复制回堆? 还有另一种安全的方法吗? 实现数据结构的最佳方法是像动态增长的数组一样只能以链表的forms增长吗?

GCC:允许C99中的重载function

我在C99中编写代码并通过GCC编译。 我想使用函数重载的风格原因(否则我必须自己做名称修改)。 我读过有没有理由说C99不支持函数重载? 但是,我仍然想知道它是否可以在GCC中启用。 你能帮助我吗?

DT_DIR未定义

我想检查readdir返回的文件是否是目录。 我尝试使用DT_DIR常量(正如man readdir所说),但它未定义。 我应该包含哪些文件才能获得它? 现在我用 #include #include #include #include gcc版本是4.6.1 编译字符串: gcc ac –std=c99 -Wall

C99指定的初始化程序重复索引在构建输出或lint中根本没有标记

前几天我在指定的初始化程序中玩了一下,我惊讶地发现,多次使用相同的索引是有效的。 更重要的是,当我这样做时,它甚至没有产生编译器警告,错误甚至信息声明,甚至PC-Lint似乎也不关心(我认为最让我感到惊讶)。 我想知道编译器是否有理由在这种情况下甚至没有提供信息消息,或者是否有其他编译器/ lint /等。 可用于捕获或标记此选项的选项。 使用的工具:Renesas RX标准工具链v1.2.0.0(C99),gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5.1)(在VM中),Lint-NT 9.00i 例如,我正在处理的一些旧代码#defines一堆命令,然后创建一个命令结构数组(这里大大简化),循环查找并使用该特定命令: #define CMD_RMEM 0 #define CMD_WMEM 1 #define CMD_XCRC 2 #define CMD_NULL 3 typedef struct { const char cmdID; const char* cmdStr; } CMD; const CMD commands[] = { {CMD_RMEM,”RMEM”}, {CMD_WMEM,”WMEM”}, {CMD_XCRC,”XCRC”}, {CMD_NULL,”NULL”}, }; 然后我想起了我在某处看到的指定初始化语法,并认为除了检测重复的命令索引之外,它还可以为数组中项目的排列提供更大的灵活性,例如: //(same #def’s & typedef as above) const CMD commands[] = […]

通过false循环跳过switch case是一种有效的操作?

这是合法代码还是违反任何规则? switch (expr) { do { case 6: /*…*/ if (/*…*/) break; case 7: /*…*/ } while (0); case 9: /*…*/ break; default: break; } 这是执行案例6的合法方式,然后是案例7,但只有在满足某些条件的情况下才会这样做吗? 或者这会导致未定义的行为并让鼻龙从交换机中出来? ps我的问题是指c99。 编辑: 我想要做的是:假设,案例9,必须在每个案例中执行。 如果expr是6,我必须执行6,在某些条件7和之后9或如果expr是7它的7-> 9所以我只想跳过7如果满足某些条件,但我不能改变6的顺序,7,9。 EDIT2: 我不是在寻找替代解决方案,我只是对这个片段的行为感兴趣。 如果switch语句在具有可变修改类型的标识符范围内具有关联的case或default标签,则整个switch语句应在该标识符的范围内。 来自ISO / IEC 9899:TC3 6.8.4.2-> 3 让我对它的行为不确定。 但我不确定那会像我的片段一样瞄准代码。

使用C99样式的指定初始化程序列表以下列方式初始化联合中位域的成员是否有效?

当我写一个关于PC-Lint的问题时 ,我假设以下初始化在C99中有效。 @JoachimPileborg提到它可能不是,我无法找到任何提供这样或那样的好例子的信息。 我知道它的编译和行为与我期望的一样,我只想知道它是正确的C99代码。 这是在C99中初始化以下联合的有效方法吗? typedef union { struct { unsigned int a : 4; unsigned int b : 4; unsigned int c : 4; unsigned int d : 4; } bits; unsigned short value; } My_Value; int main (void) { My_value test[] = { { .bits.a = 2, .bits.b = 3, .bits.c = 2, […]