如果定义了DEBUG
,我有一个标题,其中一个函数声明。
此外,我对此功能的定义具有相同的原理。但是我会知道在参数检查后是否仅在DEBUG
中定义了main()
。
我已将#include
放入main()
:
标题
#ifdef DEBUG
void printStack(Stack* st);
#endif
文件,其中函数定义为
#ifdef DEBUG
void printStack(Stack* st)
{
int i;
for (i = 0; i < st->size; i++)
printf(ValType_IOSPECIF " ",st->data[i]);
printf("\n");
}
#endif
文件,其中main()
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "calculating.h"
#define EXPR_LENGTH 1000
int main(int argc, char* argv[])
{
int argflag = 0;
if (argc >= 2)
argflag = !strcmp(argv[1], "-debug");
#if (argflag)
#define DEBUG
printf("! DEBUG !\n\n\n")
#endif
#include "stack.h" // there is a that function here
...
}
是不是?
答案 0 :(得分:4)
但是我知道在参数检查之后是否只将DEBUG定义为main()。
...
是不是?
不,那不对。
DEBUG
是在编译每个源文件时在编译时定义或不定义的预处理器宏。在编译DEBUG
时可能会定义main.c
,而在编译定义printStack
的源文件时则不会定义{。}}。
如果您使用make
或IDE,很可能是DEBUG
是否已定义用于编译每个源文件,但语言中没有任何内容可以保证这一点。
答案 1 :(得分:4)
您对C和预处理器宏感到困惑:
在编译源代码之前,所有以#
开头的内容都被预处理器替换,并且只有在运行时才执行main
。
所以,不,你做得不对。
在运行时你不能#define
或#if
;这是一个预编译时间的事情。只需使用C的常规变量和if
控制机制。
你的错误强烈指向你没有通过一个连贯的教程或C书来学习语言。也许你想要学习新文学;我能想象的任何C教程都会教你如何快速完成这项工作。
答案 2 :(得分:0)
不,那是错的。你试图根据传递的参数确定预处理的结果。以下是代码的简化版本:
#define EXPR_LENGTH 1000
int main(int argc, char* argv[])
{
int argflag = 0;
if (argc >= 2)
argflag = !strcmp(argv[1], "-debug");
#if (argflag)
#define DEBUG
printf("! DEBUG !\n\n\n")
#endif
}
使用clang -E main.c
进行预处理:
int main(int argc, char* argv[])
{
int argflag = 0;
if (argc >= 2)
argflag = !strcmp(argv[1], "-debug");
}
Pre 进程在编译之前完成,这是在执行之前启动的。因此,无法在运行时确定预处理的结果。