发现在C函数调用方 [英] Finding the function caller in C

查看:133
本文介绍了发现在C函数调用方的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿所有,我只是想知道是否有可能获得程序的名字那是一个函数内运行?

下面是一个例子:

说我叫: ./ runProgram

 的main(){一个();}函数A(){//可以检索runProgram如果我不能用主要的ARGC(argv的)常数?
}


解决方案

编译器相关的,因此:

  $ CC --version
i686的 - 苹果darwin10-GCC-4.2.1(GCC)4.2.1(苹果公司建立5646)

请程序

  $更多x.c
INT主(INT ARGC,CHAR *的argv []){
      的printf(程序:%S \\ N的argv [0]);
    富();
}
INT富(){
}$做出点¯x
CC x.c -o点¯x
x.c:在函数'主':
x.c:2:警告:内建函数'printf的不兼容的隐式声明
$ ./x
程序:./x

获取ARGC / V瓦尔的全局名称

  $纳米./x
0000000100000efe小号存根帮手
0000000100001048Ð_NXArgc
0000000100001050Ð_NXArgv
0000000100001060Ð___progname
00000001亿一__mh_execute_header
0000000100001058Ð_environ
                 ü_exit
0000000100000eebŧ_foo
0000000100000eb8ŧ_main
                 ü_printf
0000000100001020小号_pvars
                 üdyld_stub_binder
0000000100000e7cŧ启动

添加全局名称,声明为extern,并保持兼顾截断。

  $更多x2.c
INT主(INT ARGC,CHAR *的argv []){
      的printf(程序:%S \\ N的argv [0]);
    富();
}
INT富(){
    焦炭的extern ** NXArgv;
    的printf(在富:%S \\ n,NXArgv [0]);}

运行恐怖

  $作X2
CC x2.c -o X2
x2.c:在函数'主':
x2.c:2:警告:内建函数'printf的不兼容的隐式声明
x2.c:在函数'富':
x2.c:9:警告:内建函数'printf的不兼容的隐式声明
$ ./x2
程序:./x2
在富:./x2

请不要告诉我妈妈。

Hey all, I'm just wondering if it is possible to get the name of the program thats running within a function?

Here's an example:

Say I called: ./runProgram

main() {

A();

}

function A() {

// Possible to retrieve "runProgram" if I cannot use main's argc(argv) constants??
}

解决方案

Compiler dependent, so:

$ cc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)

Make the program

$ more x.c
int main(int argc, char *argv[]) {
      printf("program: %s\n", argv[0]);
    foo();
}


int foo() {    
}

$ make x
cc     x.c   -o x
x.c: In function ‘main’:
x.c:2: warning: incompatible implicit declaration of built-in function ‘printf’
$ ./x 
program: ./x

Get the global name of the argc/v vars

$ nm ./x
0000000100000efe s  stub helpers
0000000100001048 D _NXArgc
0000000100001050 D _NXArgv
0000000100001060 D ___progname
0000000100000000 A __mh_execute_header
0000000100001058 D _environ
                 U _exit
0000000100000eeb T _foo
0000000100000eb8 T _main
                 U _printf
0000000100001020 s _pvars
                 U dyld_stub_binder
0000000100000e7c T start

Add the global name, declared as extern, and keep into account the mangling.

$ more x2.c
int main(int argc, char *argv[]) {
      printf("program: %s\n", argv[0]);
    foo();
}


int foo() {
    extern char **NXArgv;
    printf("in foo: %s\n", NXArgv[0]);

}

Run the horror

$ make x2
cc     x2.c   -o x2
x2.c: In function ‘main’:
x2.c:2: warning: incompatible implicit declaration of built-in function ‘printf’
x2.c: In function ‘foo’:
x2.c:9: warning: incompatible implicit declaration of built-in function ‘printf’
$ ./x2 
program: ./x2
in foo: ./x2

Please don't tell my mom.

这篇关于发现在C函数调用方的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆