小编sud*_*03r的帖子

很长一段时间用C/C++

我在GNU的C++编译器上尝试这个代码,我无法理解它的行为:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我取消注释注释行时,代码不会编译并给出错误:

错误:对于long类型,整数常量太大

但是,如果代码按原样编译并执行,则会产生远大于10000000000的值.

为什么?

c++ types long-integer

82
推荐指数
3
解决办法
24万
查看次数

缓冲与无缓冲IO

我了解到,默认情况下,程序中的I/O是缓冲的,即它们从临时存储器提供给请求程序.我知道缓冲可以提高IO性能(可能通过减少系统调用).我已经看到了禁用缓冲的示例,例如setvbuf在C中.两种模式之间有什么区别?何时应该使用另一种模式?

language-agnostic io buffering

73
推荐指数
2
解决办法
4万
查看次数

如何转到GDB的上一行?

是否有可能在gdb中转到当前执行行之前的一行.例如:


void my_fun( somePtrType** arr,int start,int end)
{
 // arr is an array of pointers to somePtrType
  //line a
 ... some assignments
 swap(&arr[ind1] , &arr[ind2] ) ;
 //line b (current line )
}
Run Code Online (Sandbox Code Playgroud)

我现在在b行,可以检查arr那里的值,但我想回到第一行并检查arr那时的内容.

我认为这可能是不可能的,因为调试器可以以慢动作运行代码,但不能使其向后执行.
更多见解..

debugging gdb

65
推荐指数
5
解决办法
6万
查看次数

GNU C中的__attribute__

为什么以及如何 __attribute__在GNU C程序中使用?

gcc declaration function

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

用C++编写的函数指针

我有一个由dlsym()返回的void指针,我想调用void指针指向的函数.所以我通过强制转换进行类型转换:

void *gptr = dlsym(some symbol..) ;
typedef void (*fptr)();
fptr my_fptr = static_cast<fptr>(gptr) ;
Run Code Online (Sandbox Code Playgroud)

我也试过reinterpret_cast但没有运气,虽然C演员似乎工作..

c++ casting function-pointers

38
推荐指数
2
解决办法
6万
查看次数

生产代码中的LRU实现

我有一些C++代码,我需要使用LRU技术实现缓存替换.
到目前为止,我知道实现LRU缓存替换的两种方法:

  1. 每次访问缓存数据时使用timeStamp,最后在更换时比较timeStamps.
  2. 使用一堆缓存的项目并在最近访问它们时将它们移动到顶部,因此最后底部将包含LRU Candidate.

那么,哪些更适合在生产代码中使用?
他们还有其他更好的方法吗?

c++ algorithm lru

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

为什么我必须在重写[C++]时重新声明虚函数

#include <iostream>
using namespace std;

class Duck {
public:
        virtual void quack() = 0;
};

class BigDuck : public Duck {
public:
  //  void quack();   (uncommenting will make it compile)

};

void BigDuck::quack(){ cout << "BigDuckDuck::Quack\n"; }

int main() {
        BigDuck b;
        Duck *d = &b;
        d->quack();

}
Run Code Online (Sandbox Code Playgroud)

上面的代码不能编译.但是,当我在子类中声明虚函数时,它编译得很好.

如果编译器已经具有子类将覆盖的函数的签名,那么为什么需要重新声明?

任何见解?

c++ virtual-functions

27
推荐指数
3
解决办法
9102
查看次数

函数返回的字符串文字的生命周期

考虑以下代码:

const char* someFun() {
    // ... some stuff
    return "Some text!!"
}

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}
Run Code Online (Sandbox Code Playgroud)

在函数中someFun(),"Some text!!"存储的位置(我认为它可能在ROM的某个静态区域)以及它是什么范围 一生?

指向的内存是否会在retStr整个程序中被占用,或者在块A退出后被释放?

c c++ lifetime string-literals

25
推荐指数
3
解决办法
5435
查看次数

不使用sizeof的数据类型的大小

比方说我有一个数据类型,X我想知道它的大小而不声明该类型的变量或指针,当然不使用sizeof运算符.

这可能吗?我想过使用标准头文件,其中包含数据类型的大小和范围,但不适用于用户定义的数据类型.

c sizeof

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

C++中dlsym()和dlopen()的替代品

我有一个应用程序,其中一部分使用共享库.这些库在编译时链接.
在运行时,加载器期望共享对象在LD_LIBRARY_PATH,如果没有找到整个应用程序崩溃,错误"无法加载共享库".注意,不能保证客户端将拥有库,在这种情况下我想要应用程序留下合适的错误消息,独立部分也应该正常工作.

为此,我使用dlsym()dlopen()在共享库中使用API​​.这个问题是如果我在API中有很多功能,我必须单独使用dlsym()和ptrs 访问它们,在我的情况下会导致内存损坏和代码崩溃.

这有什么替代方案吗?

c++ shared-libraries dynamic-loading dlsym

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