在C模式下编译C++代码

4
以下是我保存为.cpp和.c文件的代码:
在.c文件中,它编译得很好,但在.cpp文件中抛出了以下错误。
test.cpp:6: error: initializer-string for array of chars is too long
test.cpp:6: error: initializer-string for array of chars is too long

 

#include< stdio.h>

int main()
{

char str[2][2]= { "12", "12"};
int i;

for(i=0; i<2; i++)
printf("%d %s\n", i, str[i]);

return 0;
}

是否有编译器指令或其他方法,使C++编译器将此代码视为C代码?

我尝试了extern "C",但没有帮助。

5个回答

14

在 C++(顺带一提,在 C 中也是如此),字符串 "12" 占用了 3 个位置。你需要再多一个字符来存放终止符 '\0'

char str[2][3]= { "12", "12"};

10

这将“适合”

char str[2][2] = {
  { '1', '2' },
  { '1', '2' }
};

但你想要这个:https://ideone.com/wZB8F

char str[2][3]= { "12", "12"};

否则,终止的null字符将没有空间。

等效于:

char str[2][3]= { { '1', '2', '\0' },
                  { '1', '2', '\0' } };

在第一个例子中,有一层花括号多了! - bitmask
@bitmask:抱歉,漏了那个,已经修复。 - sehe

1

C++比C语言更严格。问题在于你创建了一个包含两个字符数组的数组,然后给每个子数组分配了三个字符(顺序为'1''2'和字符串终止符'\0')。

该数组应该声明如下:

char str[2][3]= { "12", "12"};

C编译器不会标记这个问题,而是跳过字符串终止符号,因此你的printf语句很有可能在字符串后面打印垃圾字符。


0
尽管它不能解决你的问题,但你可以选择编译语言。使用gcc,你可以通过-x标志选择语言,紧接着需要指定具体的语言。例如,gcc -x c something.cpp ...将使用C编译器进行编译。

这解决了我分享的代码问题。这将使我的整个代码编译为C程序。有没有办法让我的一部分代码以C模式编译? - user1061410
据我所知,只有将程序分成多个模块(文件)才行。 - dbrank0

0
#include< stdio.h>

int main() 
{
    char str[][3]= { "12","12"}; 
    int i;

    for(i=0; i<2; i++) 
    {
        printf("%d %s\n", i, str[i]);
    }

    return 0; 
}

这是适用于C++的版本...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接