0

我究竟需要做什么才能将 argv[1] 的内容传递给不使用参数的函数?

这是如何运作的?

const char *cPtr = argv[1];

并将其传递给接受 0 个参数的 someFunction() !

4

5 回答 5

9

如果您不想将其作为参数传递,则需要将其推入全局,以便函数可以以这种方式访问​​它。我不知道其他方法(除了愚蠢的事情,比如将它写入文件main()并在函数中读取它):

static char *x;
static void fn(void) {
    char *y = x;
}
int main (int argc, char *argv[]) {
    x = argv[1];
    fn();
    return 0;
}

我不会这样做。由于您需要能够更改fn()才能访问x,我将重写它以传递参数:

static void fn(char *x) {
    char *y = x;
}
int main (int argc, char *argv[]) {
    fn(argv[1]);
    return 0;
}

当然,除非这是家庭作业、脑筋急转弯或面试问题。

于 2009-02-20T04:47:53.780 回答
3

我想知道你为什么要这样做。但是可以使用一些不太漂亮的代码来完成。本质上调用该方法,就好像它是采用 char* 参数的方法一样。然后在方法中,使用内联汇编来访问参数。这是一个使用 __cdecl 调用约定实现的 someFunction 的示例。

#include "stdafx.h"

void someFunction()
{
    TCHAR *x = NULL;
    __asm 
    {
        mov eax, dword ptr[ebp + 8]
        mov x, eax
    }

#ifdef _UNICODE
    printf("%ws\n", x);
#else
    printf("%s\n", x);
#endif
}


int _tmain(int argc, TCHAR* argv[])
{
    if (argc < 2)
        return 1;

    const TCHAR *message = argv[1];

    typedef void (*FuncPtr)(const TCHAR*);

    FuncPtr p = (FuncPtr)someFunction;

    p(message);

    return 0;
}
于 2009-02-20T05:25:08.213 回答
1

我能想到的唯一方法是使“const char *cPtr”成为全局变量。

例如

char *cPtr;

main(int argc, char **argv) 
{
    cPtr = argv[1];
} 
void someFunction()
{
  printf("%s\n", cPtr);
}
于 2009-02-20T04:48:48.723 回答
0

如果我们更多地了解为什么要将参数传递给不带参数的函数,那将会有所帮助。
例如,您是否尝试将功能应用于容器中的项目?

其他人提到了全局变量,这是一种通过将参数传递给类或结构的构造函数来“作弊”的方法:

struct fnstruct { 
    const char* p_; 
    fnstruct(const char* p) : p_(p) { }
    void operator()() { printf(p_); }
};

int main(int argc, char* argv[]) {
    if(argc < 2)
        return 0;

    fnstruct fn(argv[1]); //argument passed to constructor

    fn(); //function called with no argument!
    return 0;
}
于 2009-02-20T09:35:36.383 回答
0

做到这一点的唯一方法是将 argv[1] 存储在一个全局变量中并从函数内部访问它。

于 2009-02-20T04:48:41.017 回答