如何在 gcc 4.9.2 中创建字符串常量?

How can I create a string constant in gcc 4.9.2?

我 运行 在 Arch Linux 上使用 GCC 4.9.2,我在编译以下代码时遇到了问题:

#ifndef WORLD_H         
#define WORLD_H         
#include <string.h>
#include <stdio.h>      
//#include "removeBuffering.h"
//World dimensions      
#define WORLD_WIDTH 80          
#define WORLD_HEIGHT 20 
//World block types
#define FLAT_LAND '-'
//Instructions
#define MOVE_UP 'w'
#define MOVE_DOWN 's'
#define MOVE_RIGHT 'd'
#define MOVE_LEFT 'a'
#ifndef WIN32
#define COMMAND "clear" //Clears a linux console screen
#else
#define COMMAND "cls" //Clears a windows console screen
#endif
#define wipe() system( COMMAND )

它在我的 koding.com VM 上工作,它使用 GCC 4.8.2 但在我的本地机器上,它生成以下错误:

include/world.h:17:17: error: expected declaration specifiers or ‘...’ before string constant
 #define COMMAND "clear" //Clears a linux console screen

我认为这是由于 GCC 4.9 中的某种更改所致,但我似乎找不到任何关于它的有用信息,因此非常感谢任何帮助

运行 通过 gcc -E -- 这将扩展结果,此时一切都应该变得清晰。

在给出我自己的答案之前,我想向您简要介绍一下我的代码在生成上述错误消息时的外观。这里是 world.h:

#ifndef WORLD_H
#define WORLD_H
#include <string.h>
#include <stdio.h>
//#include "removeBuffering.h"
//World dimensions
#define WORLD_WIDTH 80
#define WORLD_HEIGHT 20
//World block types
#define FLAT_LAND '-'
//Instructions
#define MOVE_UP 'w'
#define MOVE_DOWN 's'
#define MOVE_RIGHT 'd'
#define MOVE_LEFT 'a'
#ifndef WIN32
#define COMMAND "clear" //Clears a linux console screen
#else
#define COMMAND "cls" //Clears a windows console screen
#endif
int cursorXPos;
int cursorYPos;
char world[WORLD_HEIGHT][WORLD_WIDTH+1]; //Space for null terminator
void initializeWorld();
void printWorld();
void getInput();
//void printHelp();

#endif

这里是world.c(为了保存space我清空了函数)

#include "world.h"
void initializeWorld()
{

}
void printWorld()
{

}
void getInput()
{

}
system(COMMAND);
printWorld();

这里是 GCC 提供的完整错误列表:

In file included from src/world.c:1:0:
include/world.h:17:17: error: expected declaration specifiers or ‘...’ before string constant
 #define COMMAND "clear" //Clears a linux console screen
                 ^
src/world.c:78:10: note: in expansion of macro ‘COMMAND’
   system(COMMAND);
          ^
src/world.c:79:3: warning: data definition has no type or storage class
   printWorld();
   ^
src/world.c:79:3: error: conflicting types for ‘printWorld’
src/world.c:13:6: note: previous definition of ‘printWorld’ was here
 void printWorld()

根据我的经验,处理列表中的第一个错误总是一个好主意,所以除了第一个错误之外我没有太注意任何其他事情,这就是为什么我在第一名。我最终尝试按照 Carey Gregory 和 immibis 的建议解决后来的错误。

重要的是:

src/world.c:79:3: warning: data definition has no type or storage class
   printWorld();
   ^
src/world.c:79:3: error: conflicting types for ‘printWorld’
src/world.c:13:6: note: previous definition of ‘printWorld’ was here
 void printWorld()

一旦我移动了对 printWorld()(和 system())的错位函数调用,错误就消失了。