2009-02-20 69 views
0

我需要做什麼才能將argv [1]的內容轉換爲不使用參數的函數?如何將argv [1]傳遞給一個帶0個參數的函數?

這是如何工作的?

const char *cPtr = argv[1]; 

並將它傳遞給someFunction(),該函數接受0個參數!

+1

我以前見過這個問題,還問那麼:爲什麼你不只是改變功能來傳遞參數? – paxdiablo 2009-02-20 04:52:13

+0

我同意帕克斯 - 爲什麼你會想要做你在問什麼?更多關於你(想你)需要什麼的細節將不勝感激。 – 2009-02-20 05:03:53

回答

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; 
} 

除非,當然,這是家庭作業,或者謎題,或者一個面試問題。

0

要做到這一點的唯一方法是將argv [1]存儲在全局變量中並從函數內部訪問它。

1

我能想到的唯一方法是使「const char * cPtr」成爲一個全局變量。

例如

char *cPtr; 

main(int argc, char **argv) 
{ 
    cPtr = argv[1]; 
} 
void someFunction() 
{ 
    printf("%s\n", cPtr); 
} 
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; 
} 
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; 
} 
相關問題