相关疑难解决方法(0)

是否有一个C编译器无法编译它?

我在我的探查器中闲逛一段时间试图弄清楚如何加速一个常见的日志解析器,这个解析器在日期解析时遇到瓶颈,我尝试了各种算法来加快速度.

我尝试过的对我来说最快的东西也是迄今为止最具可读性,但可能是非标准的C.

这在GCC,icc和我真正古老而挑剔的SGI编译器中运行良好.因为它是一个非常易读的优化,它不是我想要的吗?

static int parseMonth(const char *input) {
    int rv=-1;
    int inputInt=0;
    int i=0;

    for(i=0; i<4 && input[i]; i++) {
        inputInt = (inputInt << 8) | input[i];
    }

    switch(inputInt) {
        case 'Jan/': rv=0; break;
        case 'Feb/': rv=1; break;
        case 'Mar/': rv=2; break;
        case 'Apr/': rv=3; break;
        case 'May/': rv=4; break;
        case 'Jun/': rv=5; break;
        case 'Jul/': rv=6; break;
        case 'Aug/': rv=7; break;
        case 'Sep/': rv=8; break;
        case 'Oct/': rv=9; break;
        case 'Nov/': rv=10; break;
        case …
Run Code Online (Sandbox Code Playgroud)

c

21
推荐指数
5
解决办法
4710
查看次数

在被调用的函数中更改函数指针(std :: function)是否安全?

std::function指着一个函数.在这个函数内部,我将指针更改为另一个函数.

std::function<void()> fun;

void foo() {
    std::cout << "foo\n";
}

void bar() {
    std::cout << "bar\n";
    fun = foo;
}

int main() {
    fun = bar;
    fun();
    fun();
}
Run Code Online (Sandbox Code Playgroud)

我看不出任何问题,它工作正常(见这里),但我不确定这是否合法.有什么我想念的吗?也许在c ++标准草案中(我快速检查但到目前为止没有看到任何内容).

c++ c++11 std-function

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

如何发现未定义的行为

有没有办法知道你的程序是否在C++(甚至C)中有未定义的行为,而不是记住整个规范?

我问的原因是我注意到很多程序在调试中工作但没有发布是由于未定义的行为.如果有一个工具来至少帮助发现UB会很好,所以我们知道存在问题的可能性.

c c++ undefined-behavior

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

什么是"部分重叠的对象"?

我刚刚在这个帖子中经历了所有可能的Undefined Behaviors ,其中一个就是

分配给部分重叠的对象的结果

我想知道是否有人能给我一个"部分重叠的对象"的定义,以及代码中如何创建它的例子?

c++ object undefined-behavior

12
推荐指数
2
解决办法
1688
查看次数

i = ++ i和++ i之间的区别

可能重复:
任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)

是什么区别i = ++i;,并++i;在那里i与值的整数10

根据我的说法i,两个表达式完成后,两者都做同样的增量工作i =11.

c c++ operator-precedence pre-increment

11
推荐指数
2
解决办法
1400
查看次数

指向数组第一个元素之前的指针

据说在 C 中,当指针指向同一个数组或该数组末尾之后的一个元素时,算术和比较是明确定义的。那么数组第一个元素之前的一个呢?只要我不取消引用就可以了吗?

给定的

int a[10], *p;
p = a;
Run Code Online (Sandbox Code Playgroud)

(1) 写字合法--p吗?

(2)p-1在表达式中写入是否合法?

(3) 如果 (2) 没问题,我可以断言p-1 < a吗?

对此有一些实际的担忧。考虑一个reverse()函数,它反转以 结尾的 C 字符串'\0'

#include <stdio.h>

void reverse(char *p)
{
    char *b, t;

    b = p;
    while (*p != '\0')
        p++;
    if (p == b)      /* Do I really need */
        return;      /* these two lines? */
    for (p--; b < p; b++, p--)
        t = *b, *b = *p, *p …
Run Code Online (Sandbox Code Playgroud)

c pointer-arithmetic language-lawyer

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

Fortran是否具有未定义的行为?

在C和C ++中,有许多操作会导致未定义的行为,即允许编译器执行所需操作的情况。示例包括在取消分配变量后使用变量,两次取消分配变量以及取消引用空指针。

Fortran是否也具有未定义的行为?我看了一份规范草案,但未能在其中找到任何东西。例如,在释放变量之后使用变量肯定会导致程序崩溃,还是它会默默地做错事?

fortran

8
推荐指数
2
解决办法
144
查看次数

新表达的评价顺序?

在下面的代码示例中,C++标准是否保证在内存分配(调用operator new)之后但在调用X的构造函数之前评估'++ i'?

new X( ++i )
Run Code Online (Sandbox Code Playgroud)

c++

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

在什么情况下vtable指针可以为null(或0x1)?

我正在调试一个崩溃日志.发生崩溃是因为(c ++ - )对象的vtable指针是0x1,而对象的其余部分似乎可以从崩溃日志中看出来.

程序在尝试调用虚方法时崩溃.

我的问题:在什么情况下vtable指针变为空?operator delete是否将vtable指针设置为null?

这在OS X上使用gcc 4.0.1(Apple Inc. build 5493)发生.

c++ crash macos gcc vtable

7
推荐指数
3
解决办法
4802
查看次数

enum变量的默认值是多少?

我对c ++中的枚举变量有疑问:

type enmu {
   DAY1 = 1,
   DAY2,
   DAY3,
   DAY4
} DAYS;

void main() {
   DAYS days;
}
Run Code Online (Sandbox Code Playgroud)

然后天的默认值是多少?

c c++ enums

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