我刚刚进入一个拥有相当庞大代码库的项目.
我主要处理C++,他们编写的很多代码都使用布尔逻辑的双重否定.
if (!!variable && (!!api.lookup("some-string"))) {
do_some_stuff();
}
Run Code Online (Sandbox Code Playgroud)
我知道这些人都是聪明的程序员,很明显他们不会偶然这样做.
我不是经验丰富的C++专家,我唯一猜测他们这样做的原因是他们想要绝对肯定被评估的值是实际的布尔表示.所以他们否定它,然后再次否定它以使其恢复到它的实际布尔值.
这是正确的,还是我错过了什么?
在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?
我有一些广泛使用的C++代码!!.我有点困惑,因为据我所知,!!它不是一个独立的运营商,而是两个!接一个的运营商.所以那就意味着!!foo和刚刚一样foo.
!!实际上是否有任何地方和/或理由?我在考虑它是否可能有一些明智的含义?那么你首先执行一些有点操作foo,然后!对结果执行?但我似乎不记得!被用作一个有点明智的操作员,似乎没有找到任何参考告诉我它也是.据我所知!,仅用作逻辑运算符,在这种情况下
!!foo == foo
我不完全确定C,但C++允许未命名的0字段位字段.例如:
struct X
{
int : 0;
};
Run Code Online (Sandbox Code Playgroud)
在冰犯罪的回答之后编辑了这个例子
编辑:好的,多亏了目前的答案,我现在知道了理论目的.但问题是关于实际用途,所以他们仍然持有:)
Linux内核代码使用"statement-expression"和typeof扩展,使其只能在gcc下编译.
我想的更多,更没有意义.
它违背了可移植性和标准C的目的.(现在linux内核代码需要一个支持gcc扩展的特定编译器).
这是一个糟糕的设计选择还是有特定的理由让linux内核代码特定于gcc?
编辑:当我说它破坏了可移植性时,我在不同的环境中使用它.我在思考,通过符合标准C,它将被任何支持标准C的编译器所接受(这正是创建标准的目的 - 统一C的所有不同方言),因此更加便携.当然,由于gcc如此受欢迎,并且gcc支持zillion架构,因此这条线几乎毫无意义.我只是问是否有一个特定的理由背后不符合标准C.
仅使用C89的功能
typedef [unspecified token sequence] T1;
typedef [another unspecified token sequence] T2;
Run Code Online (Sandbox Code Playgroud)
展示一种语言结构,当且仅当T1和T2是相同的类型(不仅仅是兼容的)时,它将无错误地编译.对C89的限制是因为这将进入autoconf探测器.
编辑:我需要一个解决方案,即使T1或T2或两者都是不完整的类型.很抱歉之前没有提到这个.
SON OF EDIT:所有三个当前答案仅检测兼容类型.事实证明这比我记忆中的"相同类型"更接近,足够接近我目前的目的,但出于好奇,我仍然在寻找能够检测到相同类型的答案.以下是一些兼容但不相同的类型:
typedef void (*T1)(void);
typedef void (*T2)();
typedef float T1[];
typedef float T2[12];
typedef enum { ONE, TWO, THREE } T1;
typedef /* implementation-defined integer type */ T2;
Run Code Online (Sandbox Code Playgroud) 如果sizeof (struct Astruct)不均衡,是否有任何可能的方法使编译器挽救?
背景信息:我们有一个16位微处理器,如果16位值未对齐,将给处理器对齐错误.在以下情形中可能会发生这种情况:
typedef struct
{
U8BIT u8BitValue1;
U8BIT u8BitValue2;
U8BIT u8BitValue3;
} unevenAmountOf8BitValues;
typedef struct
{
U16BIT u16BitValue1;
U16BIT u16BitValue2;
} my16BitValues;
#define U8BIT_COUNT 3
#define U16BIT_COUNT 2
typedef struct
{
unevenAmountOf8BitValues u8BitValues;
my16BitValues u16BitValues;
} valuesCombined;
typedef union
{
valuesCombined myValues;
U8BIT buffer[sizeof(valuesCombined)];
struct
{
U8BIT bufferU8[U8BIT_COUNT];
U16BIT bufferU16[U16BIT_COUNT]; /* <<-- missalignment */
} valuesPerType;
} myValuesInRamAndRom
Run Code Online (Sandbox Code Playgroud)
我们现在所做的是手动计算U8BIT/U16BIT/U32BIT值的数量(以及使用excel跟踪数量)并将其放入U(8/16/32)BIT_COUNT定义中,然后执行以下操作:
#if U8BIT_COUNT % 2 == 1
#error The number of U8BIT parameters need to be …Run Code Online (Sandbox Code Playgroud) 如果x是像1010这样的4位字,你做了操作!! x,
相反,它返回... 0001或... 0000.为什么是这样?
如果我有一个定义的结构,如下所示:
struct blank {
int : 0;
};
Run Code Online (Sandbox Code Playgroud)
编译器会在运行时将其优化为零吗?
我问,因为这个相当受欢迎的SO问题.我想在我自己的C/C++代码中使用类似的编译时检查.我正在尝试使程序尽可能最佳,所以如果我只是将它们用于编译时检查,我不希望这些空结构在运行时闲置.
另一方面,是否有一种C++ - 惯用的方式来实现与链接相同的结果?