标签: c

获取C(gcc)中当前函数的指针?

gcc中有一个魔术变量,它持有一个指向当前函数的指针吗?

我想有一种表包含每个函数指针的一组信息.

我知道有一个__func__变量包含当前函数的名称作为字符串但不作为函数指针.

这不是为了调用函数而是仅仅用作索引.

编辑 基本上我想做的是能够在执行当前函数之前运行嵌套函数(并且还捕获返回以执行某些操作.)基本上,这就像__cyg_profile_func_enter和__cyg_profile_func_exit(检测函数).但问题是这些仪器功能是全局的而不是功能专用的.

编辑 在Linux内核中,你可以使用unsigned long kallsyms_lookup_name(const char *name)include/linux/kallsyms.h...请注意CONFIG_KALLSYMS选项必须被激活.

c gcc function-pointers

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

从cscope数据库生成调用树

我想从Linux中的c和c ++项目的cscope数据库生成完整和部分调用树.

项目相当大,因此使用项目的完整调用树并不容易,所以我想用函数名的grep-like过滤器来限制调用树的生成.

而且我希望能够从任何一点构建"被叫"和"被叫"子树.

因此,工具必须具有交互性且易于修补.

PS:我想使用cscope数据库,因为它已经在项目中使用并且生成它相当快.我使用vim编辑器并拥有X windows系统.

sourceforge上有cbrowser程序,但它的call-tree(callgraph)功能被破坏了.

c refactoring code-analysis analysis cscope

12
推荐指数
1
解决办法
8937
查看次数

Jetty的可扩展性如何?

问候!我使用libevent在C/C++中编写了一个高度可伸缩的HTTP事件(长轮询)服务器.然而,它很乱,很难移动,让我们面对它:它是C.更别说我一直遇到mysqlcpp连接器的一些主要问题(这是完全垃圾),以及一些与libevent的小问题(可能是因为我我正在使用2.0.1-alpha.事件服务器是C/C++,实际的后端是PHP-fpm,如果需要,我会点击(即如果有新事件).所有proxy/cgi路由都是通过nginx完成的.

我正在辩论只是用Java重写整个事件(事件服务器和后端) - 我喜欢在前端使用PHP.我听说过很多关于Jetty的好东西,但我想知道是否有人有经验部署在Jetty后端工作的真实高度并发应用程序.如果是这样,与HTTP libevent实现或等效的Erlang和Python服务器库相比,它是如何堆叠的?

我对apachebench基准测试不感兴趣所以请不要链接它们.我对并发性可伸缩性感兴趣.

感谢您的任何见解.

c java jetty libevent

12
推荐指数
1
解决办法
4801
查看次数

使用具有相同方法的类在C++中调用非成员函数

我有一个名为open的实例方法,需要调用在C中声明的函数,也称为open.关注样本:

void SerialPort::open()
{
    if(_open)
        return;
    fd = open (_portName.c_str(), O_RDWR | O_NOCTTY ); 
    _open = true;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它(使用GCC)时,我收到以下错误:

error: no matching function for call to 'SerialPort::open(const char*, int)'
Run Code Online (Sandbox Code Playgroud)

我包含了所有必需的C头.当我更改方法的名称,例如open2时,我没有编译问题.

我怎么解决这个问题.提前致谢.

c c++

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

sizeof表现出乎意料

请考虑以下代码:

  #include <stdio.h>
  int main(void)
  {
    int a[10];
    printf("%d",(int)sizeof(a)); //prints 10*sizeof(int) (40 on my compiler)
    printf("%d",(int)sizeof(a-3)); //prints sizeof(int) (4 on my compiler)

  }
Run Code Online (Sandbox Code Playgroud)

我知道这sizeof()是一个编译时运算符,但我很惊讶地看到第二个输出printf().可能是什么原因?是否存在sizeof()从数组类型到整数类型的参数的隐式转换?

c

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

链接静态库时内联函数的多个定义

我有一个C++程序,我用mingw编译(gcc for Windows).使用包含gcc 4.4.1的mingw的TDM版本.可执行文件链接到两个静态库(.a)文件:它们是用C编写的第三方库; 另一个是由我编写的C++库,它使用C库提供我自己的C++ API.

在我看来,(在我看来,过多)部分C库的功能是在内联函数中实现的.当你使用C库的API时,你无法避免包含内联函数,但当我尝试将它们全部链接在一起时,我会收到链接错误,说明所有内联函数都有多个定义 - 我都有在我的C++包装器库中调用,而我没有调用它,基本上在头文件中内联定义的任何内容都在C库和C++库中为它创建了一个函数.

当包含文件在同一项目中的不同.c或.cpp文件中多次使用时,它不会导致多个定义错误; 问题只是它为每个库生成一个定义.

编译器如何/为什么在两个库中为这些内联函数生成函数和符号?如何强制它停止在我的代码中生成它们?是否有一个工具可以运行以从.a文件中删除重复的函数,或者是一种使链接器忽略多个定义的方法?

(仅供参考,第三方库在其所有标题中都包含#ifdef __cplusplus和extern"C"保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会不确定或至少不同.)

值得注意的是,如果我链接到第三方C库的DLL,则不会发生链接错误; 然而,我得到奇怪的运行时故障似乎与我的代码有关,它应该从DLL调用自己的函数版本.(好像编译器正在创建我没有要求的本地版本的函数.)

之前已经问过这个问题的类似版本,但是,我没有找到任何这些问题的答案:

这个问题的答案是海报是多个定义变量,我的问题是内联函数的多重定义: 重复多重定义错误在多个cpps中包含相同的标题

这是一个MSVC计划,但我正在使用mingw; 另外,海报在这个问题中的问题是在标题中类主体之外定义C++类构造函数,而我的问题是内联的C函数: 静态Lib多重定义问题

这个傻瓜将他的所有C代码重命名为C++文件,他的C代码不是C++ - 安全:链接时 多个std :: functions的多个定义

这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为

c c++ linker-errors inline-functions tdm-mingw

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

fwrite原子?

一个简单的问题:

我需要在我的程序中添加一些日志记录.

如果两个进程在同一个文件上使用"fwrite"但文件描述符不同,那么写入的日志消息将是原子的或混合的.有长度限制吗?

是否定义了ANSI-C行为或实现定义?如果后来MacOSX,Linux和Windows MSVC上有什么?

c file-io atomic

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

C memcpy反过来

我正在处理音频数据.我想反向播放示例文件.数据存储为无符号整数并且包装良好且紧凑.有没有办法调用memcpy将以相反的顺序复制.即如果我有1,2,3,4存储在一个数组中,我可以调用memcpy神奇地反转它们,所以我得到4,3,2,1.

c reverse memcpy

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

在C或C++中是否可以在另一个内部创建一个函数?

如果C或C++中有可能,有人可以告诉我吗?

void fun_a();
//int fun_b();
...
main(){
   ...
   fun_a();
   ...
   int fun_b(){
     ...
   }
   ...
} 
Run Code Online (Sandbox Code Playgroud)

或类似的东西,例如函数内的类?

谢谢你的回复,

c c++

12
推荐指数
5
解决办法
5356
查看次数

OpenSSL忽略自签名证书错误

我正在用OpenSSL库编写一个小程序,假设它与SSLv3服务器建立连接.此服务器分发自签名证书,导致握手失败并显示以下消息:"sslv3警报握手失败,证书链中的自签名证书."

有没有办法可以强制连接继续进行?我试过这样调用SSL_CTX_set_verify:

SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
Run Code Online (Sandbox Code Playgroud)

但它似乎没有改变任何东西.

有什么建议?

c c++ ssl openssl ssl-certificate

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