我正在尝试将数据类型分配给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;
}
答案 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;
}