我需要做什么才能将argv [1]的内容转换为不使用参数的函数?
这是如何运作的?
const char *cPtr = argv[1];
并将其传递给带有0个参数的someFunction()!
答案 0 :(得分: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;
}
当然,除非这是家庭作业,脑筋急转弯或面试问题。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
我能想到的只是让“const char * cPtr”成为一个全局变量。
e.g。
char *cPtr;
main(int argc, char **argv)
{
cPtr = argv[1];
}
void someFunction()
{
printf("%s\n", cPtr);
}
答案 3 :(得分:0)
执行此操作的唯一方法是将argv [1]存储在全局变量中,并从函数中访问它。
答案 4 :(得分: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;
}