Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预处理器定义在C中不起作用_C_C Preprocessor - Fatal编程技术网

预处理器定义在C中不起作用

预处理器定义在C中不起作用,c,c-preprocessor,C,C Preprocessor,我一直在疯狂地尝试让下面的代码工作。预处理器定义WIDR和LIDR不起作用,它给了我编译错误: projects/elcain.c: In function ‘main’: projects/elcain.c:17:6: error: ‘WIDR’ undeclared (first use in this function) if ( WIDR ) { ^ projects/elcain.c:17:6: note: each undeclared identifier is re

我一直在疯狂地尝试让下面的代码工作。预处理器定义WIDR和LIDR不起作用,它给了我编译错误:

projects/elcain.c: In function ‘main’:
projects/elcain.c:17:6: error: ‘WIDR’ undeclared (first use in this function)
 if ( WIDR ) {
      ^
projects/elcain.c:17:6: note: each undeclared identifier is reported only once for each function it appears in
projects/elcain.c:19:13: error: ‘LIDR’ undeclared (first use in this function)
 } else if ( LIDR ) {
我没有使用预处理器宏的经验,也没有使用预处理器的经验,所以请对我放松点

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN32
#define WIDR 1
#elif defined _linux_
#define LIDR 1
#endif

int main () {

char* directory = (char*) malloc (1);
if ( WIDR ) {
    strcpy(directory, "C:\\TEMP\\");
} else if ( LIDR ) {
    strcpy(directory, "~/.temp/");
} else {
    *directory = 0x00;
}

printf("%s\n", directory);
return 0;
}
#包括
#包括
#包括
#ifdef_WIN32
#定义WIDR 1
#elif定义的_
#定义LIDR 1
#恩迪夫
int main(){
char*目录=(char*)malloc(1);
if(WIDR){
strcpy(目录,“C:\\TEMP\\”;
}否则如果(LIDR){
strcpy(目录“~/.temp/”;
}否则{
*目录=0x00;
}
printf(“%s\n”,目录);
返回0;
}

您要查找的内容如下:

#include <stdlib.h>

#if defined unix        ||                                                     \
    defined __unix      ||                                                     \
    defined __unix__    ||                                                     \
    defined __linux__   ||                                                     \
    defined __FreeBSD__ ||                                                     \
    defined __CYGWIN__  ||                                                     \
    (defined __APPLE__ && defined __MACH__)
    static const char TMP_DIR[] = "~/.temp/";
#elif defined WIN32   ||                                                       \
      defined _WIN32  ||                                                       \
      defined __WIN32
    static const char TMP_DIR[] = "C:\\TEMP\\";
#else
    #error "Platform not supported"
#endif

int
main(void)
{
    printf("%s\n", TMP_DIR);
    return EXIT_SUCCESS;
}
#ifdef WIDR 
    strcpy(directory, "C:\\TEMP\\");
#elif defined LDIR
    strcpy(directory, "~/.temp/");
#else
    *directory = 0x00;
#endif
#包括
#如果定义为unix | |\
定义的uuunix | |\
已定义的unix\
定义的linux\
定义的uu FreeBSD_uuu | |\
定义为uucygwin_uuuu124;|\
(已定义的_苹果__&&defined马赫_;)
静态常量字符TMP_DIR[]=“~/.temp/”;
#elif定义的WIN32 | |\
定义的_WIN32 | |\
已定义\uuuu WIN32
静态常量字符TMP_DIR[]=“C:\\TEMP\\”;
#否则
#错误“不支持平台”
#恩迪夫
int
主(空)
{
printf(“%s\n”,TMP\u DIR);
返回退出成功;
}

您可能只是想要:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main () {
#ifdef _WIN32
   char directory[] = "C:\\TEMP\\";
#elif defined _linux_
   char directory[] = "~/.temp/";
#else
#error Neither _WIN32 nor _linux_ are defined
#endif

   printf("%s\n", directory);
   return 0;
}
#包括
#包括
#包括
int main(){
#ifdef_WIN32
字符目录[]=“C:\\TEMP\\”;
#elif定义的_
字符目录[]=“~/.temp/”;
#否则
#错误:未定义_WIN32或_linux
#恩迪夫
printf(“%s\n”,目录);
返回0;
}

实际上,WIDR和LIDR都是条件编译指令。换句话说,它们只在编译时存在

按如下方式更改代码:

#include <stdlib.h>

#if defined unix        ||                                                     \
    defined __unix      ||                                                     \
    defined __unix__    ||                                                     \
    defined __linux__   ||                                                     \
    defined __FreeBSD__ ||                                                     \
    defined __CYGWIN__  ||                                                     \
    (defined __APPLE__ && defined __MACH__)
    static const char TMP_DIR[] = "~/.temp/";
#elif defined WIN32   ||                                                       \
      defined _WIN32  ||                                                       \
      defined __WIN32
    static const char TMP_DIR[] = "C:\\TEMP\\";
#else
    #error "Platform not supported"
#endif

int
main(void)
{
    printf("%s\n", TMP_DIR);
    return EXIT_SUCCESS;
}
#ifdef WIDR 
    strcpy(directory, "C:\\TEMP\\");
#elif defined LDIR
    strcpy(directory, "~/.temp/");
#else
    *directory = 0x00;
#endif

然后编译错误将消失

未定义
\u WIN32
\u linux
。如果未定义
\u WIN32
,则也未定义
WIDR
。总之,这是完全错误的,因为不能同时定义WIRD和LIDR,但它们都在程序中使用。顺便说一句,malloc(1)是荒谬的。想一想,你可能应该解释一下你到底想达到什么目的。这听起来像是一个.C++程序,决定试试C。当我看到“新”是C++关键字时,我震惊了,开始寻找替代品。谢谢你的建议,我希望你不介意我问,我应该用什么来代替malloc代码呢?我认为你的条件句中的第三种情况应该是
\else
而不是
\elif
!谢谢你的帮助!在尝试像这样的东西之前,我会研究更多的C语言。再次感谢!另一方面,是吗?如果定义windows->
“C:\\TEMP\\”
。我的坏,是的,'有点匆忙:)