我试图弄清楚各种头文件中的整数类型定义是如何相互关联的。
我刚刚安装了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代码库.代码库可以使用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)
那可能吗?
到目前为止,所有答案都围绕着海湾合作委员会.怎么样的Microsoft cl.exe?我尝试了/ P选项,它将预处理结果发送到文件.但结果包含许多行,如下所示:
#line 1306 "<some file path>"
Run Code Online (Sandbox Code Playgroud)
我想解决它.
好的,我解决了.指定两者/P并/EP可以禁止#line指令.
两个指定的输出"/P /EP"为cl.exe是一个*.i没有文件#line的指令.这是一个有效的C源文件.所以它可以直接输入cl.exe.我只是重命名原始的C文件并使用该*.i文件进行检测,然后使用构建过程.
(注意避免包含一些头文件/FI.这可能会导致一些重复的定义错误.应该删除它们,因为它们的内容已经包含在*.i文件中.)
我可以使用/P开关.该#line指令不会危害编译,并且可以被C解析器识别.如cJonathan Leffler所指出的那样,如果没有这些信息,很难从仪表代码回溯到原始源代码.
仪器仪表并不容易.例如,根据此处的基于块的代码覆盖的块分离是棘手的(注意块4).
根据MSDN:
Monitor 类由静态(在 C# 中)或共享(在 Visual Basic 中)方法组成,这些方法对控制对关键部分的访问的对象进行操作。为每个同步对象维护以下信息:
对当前持有锁的线程的引用。
对就绪队列的引用,其中包含准备获取锁的线程。
对等待队列的引用,其中包含正在等待锁定对象状态更改通知的线程。
在这个线程中,两个队列引起了一些微妙的问题。
我认为上述线程中问题的根本原因是有 2 个队列。如果只有一个队列,则无论何时Monitor.Pulse(),都只能调度该队列中的一个线程来运行。没有办法让多个线程同时处于就绪状态。所以这个问题永远不应该发生。
那么为什么a要Monitor保留2个队列呢?
我希望以下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)