小编smw*_*dia的帖子

如何使用GNU C预处理器预定义的宏?

我试图弄清楚各种头文件中的整数类型定义是如何相互关联的。

我刚刚安装了CygWin。我打开了Cygwin\x86\usr\include\machine\_default_types.h。在其中,我注意到以下代码片段:

#ifdef __INT8_TYPE__
typedef __INT8_TYPE__ __int8_t;
Run Code Online (Sandbox Code Playgroud)

根据这里__INT8_TYPE__是预定义的预处理器宏之一。和:

您不应该直接使用这些宏。而是包括适当的标头并使用typedef。如果GCC在某些系统上未提供stdint.h标头,则可能无法在特定系统上定义其中的某些宏。

因此,似乎__INT8_TYPE__应该在其他地方定义。但是我搜索了整个CygWin安装,但没有定义。我发现的只是上面的一些条件语句。

因为我不应该直接使用它。而且没有其他文件在定义它。这个宏如何生效?还是我误会了什么?

c macros gcc cygwin

0
推荐指数
1
解决办法
889
查看次数

有没有办法在GCC或cl.exe的预处理和编译之间插入一个步骤?

我正在尝试设置一个大的C代码库.代码库可以使用GCC和MS cl.exe构建.代码库包含数百万行.我正在尝试将其用于代码覆盖.因为运行时环境很特殊,所以我必须以特殊的方式进行检测.

我编写了一个可以执行检测的转换工具.但是它无法处理宏扩展,头文件包括等等.换句话说,它必须在预处理阶段之后工作.

我可能没有足够的时间来编写C预处理器.由于代码库是使用GCC/cl.exe构建的,我想知道是否可以将我的转换步骤注入GCC或cl.exe编译过程.像这样:

GCC/cl.exe pre-process  ->  (My transformation) -> GCC/cl.exe compilation
Run Code Online (Sandbox Code Playgroud)

那可能吗?

添加1

到目前为止,所有答案都围绕着海湾合作委员会.怎么样的Microsoft cl.exe?我尝试了/ P选项,它将预处理结果发送到文件.但结果包含许多行,如下所示:

#line 1306 "<some file path>"
Run Code Online (Sandbox Code Playgroud)

我想解决它.

好的,我解决了.指定两者/P/EP可以禁止#line指令.

添加2

两个指定的输出"/P /EP"cl.exe是一个*.i没有文件#line的指令.这是一个有效的C源文件.所以它可以直接输入cl.exe.我只是重命名原始的C文件并使用该*.i文件进行检测,然后使用构建过程.

(注意避免包含一些头文件/FI.这可能会导致一些重复的定义错误.应该删除它们,因为它们的内容已经包含在*.i文件中.)

添加3

我可以使用/P开关.该#line指令不会危害编译,并且可以被C解析器识别.如cJonathan Leffler所指出的那样,如果没有这些信息,很难从仪表代码回溯到原始源代码.

添加4

仪器仪表并不容易.例如,根据此处的基于块的代码覆盖的块分离是棘手的(注意块4).

c gcc cl

0
推荐指数
1
解决办法
65
查看次数

为什么Monitor类保留2个队列:“就绪”和“等待”?

根据MSDN

Monitor 类由静态(在 C# 中)或共享(在 Visual Basic 中)方法组成,这些方法对控制对关键部分的访问的对象进行操作。为每个同步对象维护以下信息:

  • 对当前持有锁的线程的引用。

  • 对就绪队列的引用,其中包含准备获取锁的线程。

  • 对等待队列的引用,其中包含正在等待锁定对象状态更改通知的线程。

在这个线程中,两个队列引起了一些微妙的问题。

我认为上述线程中问题的根本原因是有 2 个队列。如果只有一个队列,则无论何时Monitor.Pulse(),都只能调度该队列中的一个线程来运行。没有办法让多个线程同时处于就绪状态。所以这个问题永远不应该发生。

那么为什么a要Monitor保留2个队列呢?

c# queue multithreading

-1
推荐指数
1
解决办法
362
查看次数

Perl:为什么双引号在打印时会增加额外的空间?

我希望以下2张照片是相同的.

@a=(a..z);
print "@a\n";
print @a;
Run Code Online (Sandbox Code Playgroud)

但实际上,它给了我这个:

a b c d e f g h i j k l m n o p q r s t u v w x y z
abcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)

为什么多余的空间?

我正在使用ActivePerl for Windows.

更新

通过以下2个答案,我想出了这个:

use English;
$LIST_SEPARATOR="*";
@a=(a..z);
print "@a\n";
Run Code Online (Sandbox Code Playgroud)

它给了我这个:

a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z
Run Code Online (Sandbox Code Playgroud)

perl

-3
推荐指数
2
解决办法
253
查看次数

标签 统计

c ×2

gcc ×2

c# ×1

cl ×1

cygwin ×1

macros ×1

multithreading ×1

perl ×1

queue ×1