如何声明变量参数的数据类型?

时间:2018-06-22 11:39:07

标签: c macros variadic-functions

我正在尝试将数据类型分配给world,但无法弄清楚。

#include <stdarg.h>
#include <stdio.h>
#define TRACE(arg)  TraceDebug arg ;\
                       void TraceDebug(const char* format, ...);            

void TraceDebug(const char*  format, ...)
{
        char buffer[256];
        va_list args;
        va_start(args, format);
        vprintf(format, args);        
        va_end(args);
}

int main(void)
{
    int a =55;
    TRACE((Hello,a));
    return 0;
}

下面是详细的错误声明。

main.c: In function 'main':
main.c:28:12: error: 'Hello' undeclared (first use in this function)
     TRACE((Hello,a));
            ^
main.c:13:32: note: in definition of macro 'TRACE'
 #define TRACE(arg)  TraceDebug arg ;\
                                ^
main.c:28:12: note: each undeclared identifier is reported only once for each function it appears in
     TRACE((Hello,a));
            ^
main.c:13:32: note: in definition of macro 'TRACE'
 #define TRACE(arg)  TraceDebug arg ;\
                                ^

在声明需要获取变量的地址之后,是否有可能将Hello声明为变量。

  

简单地说,我想将以下代码更改为可变参数函数   例如#define QU(arg1,arg2)#define QU(arg1,...),因为使用可变参数功能不支持可变参数宏。

#define TRACE(arg1)  QU arg1
#define QU(arg1,arg2)         {static const char arg1; \
                              printf("%p\n",(void*)&arg1);\
                              printf("%d\n",arg2);}\

int main(void)
{
    int aaa =333;
    int bbb =444;
    TRACE((Hello,aaa));
    TRACE((Hello2,bbb));
    return 0;
}

1 个答案:

答案 0 :(得分:0)

1)(标题)如何声明变量参数的数据类型?
2)(第一个问题)我正在尝试将数据类型分配给 world ,但无法弄清楚。

1) variadic 参数的数据类型(由椭圆表示:...)始终是椭圆之前的变量类型。对于此原型:

int variadicFunc(int a, const char *b, ...);
                        ^^^^^^^^^^     ^^^
                        type           assumes the type const char *

2)仅从您问题的内容来看,答案可能是使用typedef语句:

typedef char World;  // a new type 'World' is created   

但是评论中有澄清:

  • 如果我将字符串更改为变量,则可以减小内存大小, ...(您)
  • 您想要一个变量参数列表来传递要放在程序的现有变量中,这些变量要放在“跟踪”列表中以进行调试 目的。 (关闭吗?) ...(我)
  • (关闭了吗?)是的,这就是尝试要做的事情...您是否总是要向该函数传递相同的类型?啊,输入 像TRACE(("Hello", a,"world")); (你)

看来您想要输入可变数量的字符串文字或字符串变量作为函数参数,然后将那些项目放入变量,然后将这些变量的地址存储在文件中节省空间。

以下代码说明了如何将可变数量的字符串(以不同的形式)传递给函数,并将地址和内容保留在结构中。由此,您应该能够从我在这里所做的事情中适应对您的需求更有用的东西。请注意,我保留了第一个字符串参数,以用作文件位置来存储地址。

#define MAX_LEN 200

typedef struct {
    unsigned int addr;
    char str[MAX_LEN];
} DATA;


int variadicFunc(int argCount, const char *str, ...);

int main(void)
{
    char a[] = {"this is a string"};
    char b[] = {"another string"};
    char c[] = {"yet another string"};

    //           count   non-variable v1 v2      v3       v4
    variadicFunc(4, ".\\storage.txt", a, b, "var string", c);
    //           ^count of variable argument list  


    return 0;
}
int variadicFunc(int argCount, const char *str, ...)
{
    va_list arg;
    int i;
    char sAddr[10];

    DATA *d = calloc(argCount, sizeof(*d));

    va_start(arg, str);
    FILE *fp = fopen(str, "w");//using first string as filename to populate
    if(fp)
    {
        for(i=0;i<argCount;i++)
        {
            // retain addresses and content for each string
            strcpy(d[i].str, va_arg(arg, const char *));
            d[i].addr = (unsigned int)&d[i].str[i];
            sprintf(sAddr, "%X\n", d[i].addr);
            fputs(sAddr, fp);
        }
        fclose(fp);
    }

    return 0;   
}