C #需要在程序中显示之前包含
我有一个标题,其中一个函数声明是否定义了C #需要在程序中显示之前包含,c,include,c-preprocessor,C,Include,C Preprocessor,我有一个标题,其中一个函数声明是否定义了DEBUG 我对这个函数也有一个定义,它的工作原理是一样的。但是我会知道,在参数检查之后,是否只在main()中定义了DEBUG 我已将#include放入main(): 标题: #ifdef DEBUG void printStack(Stack* st); #endif 函数定义所在的文件 #ifdef DEBUG void printStack(Stack* st) { int i; for (i = 0; i < st-&g
DEBUG
我对这个函数也有一个定义,它的工作原理是一样的。但是我会知道,在参数检查之后,是否只在main()
中定义了DEBUG
我已将#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
#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
...
}
#ifdef调试
无效打印堆栈(堆栈*st)
{
int i;
对于(i=0;isize;i++)
printf(ValType_IOSPECIF“”,st->data[i]);
printf(“\n”);
}
#恩迪夫
main()所在的文件
#ifdef DEBUG
void printStack(Stack* st)
{
int i;
for (i = 0; i < st->size; i++)
printf(ValType_IOSPECIF " ",st->data[i]);
printf("\n");
}
#endif
#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
...
}
#包括
#包括
#包括
#包括“计算.h”
#定义表达式长度1000
int main(int argc,char*argv[])
{
int argflag=0;
如果(argc>=2)
argflag=!strcmp(argv[1],“-debug”);
#如果(argflag)
#定义调试
printf(“!DEBUG!\n\n\n”)
#恩迪夫
#包括“stack.h”//这里有一个函数
...
}
是这样吗
但我知道调试是否只在参数检查后定义到main()中
是这样吗
不,那是不对的
DEBUG
是编译每个源文件时在编译时定义或不定义的预处理器宏。可能在编译main.c
时定义了DEBUG
,但在编译定义printStack
的源文件时没有定义
如果您使用
make
或IDE,则很可能在编译每个源文件时定义了DEBUG
,但语言中没有任何东西可以保证这一点。您混淆了C和预处理器宏:
在编译源代码之前,所有以#
开头的代码都会被预处理器替换,并且只有在运行时才会执行main
所以,不,你做得不对
您不能在运行时定义或(如果);这是一个预编译时间的东西。只需使用C的正常变量和if
控制机制
您的错误强烈地表明您没有通过连贯的教程或C语言书来学习该语言。也许你想学习新文学;我能想象得到的任何C教程都会教你如何快速完成这项任务。不,那是错误的。您正试图根据传递的参数确定预处理的结果。以下是代码的简化版本:
#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");
}
预处理在编译之前完成,编译在执行之前开始。因此,无法在运行时确定预处理的结果。“其中一个函数声明if DEBUG”-否,如果定义了DEBUG
,则定义该函数。您应该从命令行传递这个宏,而不是在代码中定义它。一般来说,排除整个函数是一个不好的主意,因为这会使您的代码在没有它的情况下不是编译器。运行gcc-E main.c
,检查结果irc,它是NDEBUG
宏。不确定是否实际支持DEBUG
。@Olaf,该标准讨论了与assert
相关的NDEBUG
。我想到OP想知道与NDEBUG无关的DEBUG
。嗯,我怀疑他实际上想到了类似于NDEBUG
的东西,但不是混淆了名称,就是仅仅遵循传闻。