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
的东西,但不是混淆了名称,就是仅仅遵循传闻。