小编Jam*_*ris的帖子

stdbool.h在哪里?

我想_Bool在我的系统上找到定义,因此对于缺少它的系统,我可以实现它.我在这里和其他网站上看到过各种各样的定义,但是想要检查系统的最终定义.

轻微的问题,因为我找不到_Bool定义的地方甚至stdbool.h

mussys@debmus:~$ find /usr/include/* -name stdbool.h
/usr/include/c++/4.3/tr1/stdbool.h
Run Code Online (Sandbox Code Playgroud)

grep对于_Bool/usr/include/*/usr/include/*/*不要么找到它.

那它在哪里?

c linux gcc boolean

22
推荐指数
3
解决办法
4万
查看次数

_Bool和bool:如何解决使用_Bool的C库的问题?

我在C中编写了一组数据结构和函数,其中一些使用_Bool数据类型.当我开始时,该项目将是纯粹的C.现在我正在研究使用基于C++的GUI工具包并将后端代码放入库中.

但是,在编译C++ GUI时,编译器会发出以下错误:

ISO C++ forbids declaration of '_Bool' with no type

我最初以为我可以搜索和替换_Bool,以bool创造:

/* mybool.h */
#ifndef MYBOOL_H
#define MYBOOL_H

typedef _Bool bool;

#endif /* MYBOOL_H */
Run Code Online (Sandbox Code Playgroud)

然后在任何使用_Bool的标头中

#ifdef __cplusplus
extern "C" {
#else
#include "mybool.h"
#endif

/* rest of header... */
Run Code Online (Sandbox Code Playgroud)

直到我意识到这将使用一个布尔(C _Bool)数据类型编译库,并使用另一个(C++ bool)链接库.实际上,这可能无关紧要,但从理论上讲,它可能确实存在(可能会有一些模糊的系统,这样做会导致宇宙向内翻).

我想我可以使用一个int并使用0表示false,将1表示为true,并使用类似的方法对其进行类型设置typedef int mybool,但它似乎没有吸引力.

有没有更好/惯用/标准的方法来做到这一点?

c c++ boolean

16
推荐指数
3
解决办法
1万
查看次数

"警告:假设循环不是无限"的解释是什么?

我刚刚决定改变所有变量unsigned,int并在重新编译有问题的代码时受到此警告消息的欢迎:

freespace_state.c:203: warning: assuming that the loop is not infinite
Run Code Online (Sandbox Code Playgroud)

有问题的一行:

for (x = startx; x <= endx; ++x, ++xptr)
Run Code Online (Sandbox Code Playgroud)

这个循环是60行代码(包括空格/括号等),并且goto在其中有一个,并且至少出现一次continue.

在这种情况下,我认为我很欣赏GCC假设这个循环不是无限的,因为它永远不应该无限循环.

GCC试图在这里告诉我什么?

警告的语法几乎暗示警告应该在某些其他警告的范围内进行,但在该背景下没有警告.

[编辑] 这完全是我自己的错.我从这里的一个问题偷了一些优化和警告选项而没有真正理解它们,并且从此忘记了它们.

请参阅Mark Rushakoff的回答,此外,我还习惯-Wunsafe-loop-optimizations明确警告GCC是否对循环做出假设.请参阅http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

c gcc gcc-warning

14
推荐指数
1
解决办法
1221
查看次数

为什么没有人为脑死亡创建一个开源构建系统?

我想建立一个共享库.GNU/Linux是开发和目标平台.C是实现语言.

我无法决定如何设置构建系统并继续围绕三个选项,每个选项都有很多不喜欢的理由:

  • 手工制作的Makefile - 我过去几乎都是这样做的
  • GNU Autotools - 我今年早些时候使用autotools来构建一个共享的C库,但是忘记了我是如何做到这一点的,以及我用于搜索的所有数百个教程.
  • waf - 据说简单但不那么容易我今天下午工作了.

我无法决定去哪.我会选择一个,开始工作然后遇到问题,并决定其他系统更好.我卡住了卡住了.有人可以解释一下这可能有助于我解决这个问题吗?

build autotools configure waf

12
推荐指数
3
解决办法
2288
查看次数

如何使用waf构建共享库?

我想使用waf构建一个共享库,因为它看起来比GNU autotools更容易,更简洁.

到目前为止,我实际上有几个与我开始写的wscript有关的问题:

VERSION='0.0.1'
APPNAME='libmylib'

srcdir = '.'
blddir = 'build'

def set_options(opt):
 opt.tool_options('compiler_cc')
 pass

def configure(conf):
 conf.check_tool('compiler_cc')
 conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb')

def build(bld):
 bld.new_task_gen(
  features = 'cc cshlib',
  source = '*.c',
  target='libmylib')
Run Code Online (Sandbox Code Playgroud)

包含的行source = '*.c'不起作用.我必须指定每个.c文件而不是使用通配符吗?

我怎样才能启用调试版本(目前wscript正在使用调试版本CFLAGS,但我想让最终用户选择它).

计划将库源放在子目录中,以及在每个子目录中使用lib的程序.

c linux shared-libraries waf

10
推荐指数
1
解决办法
6788
查看次数

快速块放置算法,需要建议吗?

我需要模拟Fluxbox窗口管理器的窗口放置策略.

作为一个粗略的指南,可视化随机大小的窗口一次一个地填满屏幕,其中每个窗口的粗略大小导致屏幕上平均80个窗口,而没有任何窗口与另一个窗口重叠.

如果您的系统上安装了Fluxbox和Xterm,您可以尝试使用xwinmidiarptoy BASH脚本来查看我想要发生的事情的粗略原型.请参阅我写过的xwinmidiarptoy.txt说明,解释它的作用以及如何使用它.

重要的是要注意窗口将关闭,并且关闭先前占用的窗口的空间再次可用于放置新窗口.

该算法需要是一个在线算法处理数据"以串行方式逐个处理,即按照输入被提供给算法的顺序,而不需要从一开始就提供整个输入."

Fluxbox窗口放置策略有三个我想模拟的二元选项:

  • Windows构建水平行垂直列(可能)

  • Windows从左到右从右到左放置

  • Windows从上到下从下到上放置

目标算法与窗口放置算法之间的差异

坐标单位不是像素.将放置块的网格将是128 x 128个单位.此外,放置区域可以通过放置在网格内的边界区域进一步收缩.

为什么算法有问题?

它需要在音频应用程序中运行到实时线程的最后期限.

此刻我只关心获得快速算法,不关心实时线程的含义以及编程带来的所有障碍.

虽然算法永远不会放置一个与另一个重叠的窗口,但是用户将能够放置和移动某些类型的块,将存在重叠的窗口.用于存储窗口和/或空闲空间的数据结构需要能够处理这种重叠.

到目前为止,我有两个选择,我已经建立了松散的原型:

1)Fluxbox放置算法的一个端口到我的代码中.

问题是,当我尝试使用该算法放置256块的最坏情况时,客户端(我的程序)被踢出音频服务器(JACK).该算法在放置第256个窗口时对已经放置的块列表执行超过14000次完整(线性)扫描.

为了演示这一点,我创建了一个名为text_boxer-0.0.2.tar.bz2的程序,该程序将文本文件作为输入并将其排列在ASCII框中.问题make来构建它.有点不友好,使用--help(或任何其他无效选项)的命令行选项列表.您必须使用该选项指定文本文件.

2)我的替代方法.

仅部分实现,该方法对矩形空闲未使用空间的每个区域使用数据结构(窗口列表可以完全分离,并且不需要用于测试该算法).数据结构充当双向链表中的节点(具有排序插入),并且包含左上角的坐标以及宽度和高度.

此外,每个块数据结构还包含四个链接,这四个链接连接到四个边中的每一个上的每个紧邻(触摸)块.

重要规则:每个块每侧只能触摸一个块.这是一种特定于算法存储空闲未使用空间的方法的规则,并且不会影响实际窗口可能相互接触的数量.

这种方法的问题是,它非常复杂.我已经实现了直接的情况,其中1)从块的一个角去除空间,2)分割相邻的块以便遵守重要的规则.

不太直接的情况,其中要移除的空间只能在一列或一排框中找到,只是部分实现 - 如果要移除的一个块完全适合宽度(即列)或高度(即然后出现问题.甚至没有提到这个事实,它只检查一个框宽的列,并排一个框高.

我已经用C语言实现了这个算法 - 我正在使用这个项目的语言(我几年没有使用过C++,在把注意力都集中在C开发之后使用它很不舒服,这是一个爱好).实现是700多行代码(包括大量空行,支撑线,注释等).该实现仅适用于水平行+左右+上下放置策略.

所以我要么添加一些方法来使这些+700行代码适用于其他7个放置策略选项,或者我将不得不为其他7个选项复制那些+700行代码.这些都不具吸引力,第一,因为现有代码足够复杂,第二,因为膨胀.

由于缺少功能,该算法甚至不能在实时最坏情况下使用它,因此我仍然不知道它实际上是否比第一种方法更好或更差.

该算法的C实现的当前状态是freespace.c.我用它gcc -O0 -ggdb freespace.c来构建,并以xterm大小运行它至少至少124 x 60个字符.

那里还有什么?

我撇去并打折: …

algorithm packing bisection

10
推荐指数
2
解决办法
1886
查看次数

C标准对结构指针及其第一个成员的说法是什么?

考虑以下两点struct:

struct a
{
    int a;
};

struct b
{
    struct a a_struct;
    int b;
};
Run Code Online (Sandbox Code Playgroud)

以下实例struct b:

struct b b_struct;
Run Code Online (Sandbox Code Playgroud)

这个条件:

if (&b_struct == (struct b*)&b_struct.a_struct)
    printf("Yes\n");
Run Code Online (Sandbox Code Playgroud)

C标准是否要求始终评估为真?

c standards struct pointers

10
推荐指数
2
解决办法
309
查看次数

在C中决定返回值的一般方法是什么?

我的程序是用C语言编写的Linux,并且有许多函数,它们具有不同的返回值模式:

1)一次或两次n成功和-1失败的回报.
2)一些0成功和-1失败的回报.
3)成功时返回1,失败时返回0(我通常使用布尔类型).
4)指针返回0失败(我通常使用spurn NULL).

我的混乱出现在前三个 - 返回指针的函数总是0在失败时返回,这很容易.

第一个选项通常涉及返回长度的函数,该长度可能只是正数.

第二个选项通常涉及命令行处理函数,但我不确定它是否正确,或许更好的值是EXIT_SUCCESS和EXIT_FAILURE?

第三个选项适用于在条件内调用方便且自然的函数,我通常使用int值1和0 来模拟布尔类型.

尽管这一切似乎相当明智的,我仍然觉得哪里的区域,这是不太清楚或明显为当我创建的功能,或风格是在使用时,我想用它来使用的风格.

那么在决定返回类型时,如何为我的方法增加清晰度呢?

c linux function return-value

9
推荐指数
1
解决办法
416
查看次数

是否有广泛的C库用于从文件中读取名称/值对?

我的程序正在读取包含设置文件的各种文本行的文本文件.有些线路可能变得非常大.目前缓冲区大小为4096个字符.某些线路可能会超出此范围,无论是通过恶意还是由于程序中运行的各种因素.

当前的例程编写起来相当繁琐,现在我想扩展文件的可能内容,这将需要更多这些繁琐的重复代码.(这适用于设置类型文件,由name value对和偶尔的节标题组成.由于多个精度,某些数值需要作为字符串读取).

我想要的主要是读取没有缓冲区溢出的任意长度行.我刚刚发现getline可以为我做到这一点,但是,为了天堂的缘故,还有一个图书馆可以为我做这一切繁琐的工作吗?

编辑:

我不希望被迫=在名称和值之间放置一个符号,空格应该足以作为分隔符.

广泛使用,我的意思是该库应该在流行的Linux发行版的标准包中提供.

我知道libconfig但是我的要求似乎完全矫枉过正.

c linux settings file-io

7
推荐指数
1
解决办法
2664
查看次数

在另一个整数的MSB位置左侧的整数中查找N个连续的零位

问题是:给定一个整数val1找到最高位集(最高有效位)的位置然后,给定第二个整数,val2找到从第一个整数产生的位置左侧的未设置位的连续区域.width指定必须在邻接中找到的最小未设置位数(即width,其中没有一个的零).

这是我的解决方案的C代码:

#include <limits.h> /* for CHAR_BIT - number of bits in a char */

typedef unsigned int t;
unsigned const t_bits = sizeof(t) * CHAR_BIT;

_Bool test_fit_within_left_of_msb(  unsigned width,
                                    t val1, /* integer to find MSB of */
                                    t val2, /* integer to find width zero bits in */
                                    unsigned* offset_result)
{
    unsigned offbit = 0; /* 0 starts at high bit */
    unsigned msb = 0;
    t mask; …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation

7
推荐指数
1
解决办法
1945
查看次数