2010-03-07 4 views
0

Я хочу использовать этот код С в моем проекте C++: mysql.c:Использование C кода в проекте C++

/* Simple C program that connects to MySQL Database server*/ 
#include <mysql.h> 
#include <stdio.h> 
#include <string.h> 

main() { 
    MYSQL *conn; 
    MYSQL_RES *res; 
    MYSQL_ROW row; 

    char *server = "localhost"; 
    char *user = "root"; 
    char *password = "rebourne"; /* set me first */ 
    char *database = "mydb"; 

    conn = mysql_init(NULL); 

    /* Connect to database */ 
    if (!mysql_real_connect(conn, server, 
     user, password, database, 0, NULL, 0)) { 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit(1); 
    } 

    /* send SQL query */ 
    if (mysql_query(conn, "show tables")) { 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit(1); 
    } 

    res = mysql_use_result(conn); 

    /* output table name */ 
    printf("MySQL Tables in mysql database:\n"); 
    while ((row = mysql_fetch_row(res)) != NULL) 
     printf("%s \n", row[0]); 

    /* close connection */ 
    mysql_free_result(res); 
    mysql_close(conn); 
} 

он компилирует с GCC:

gcc -o output-file $(mysql_config --cflags) mysql.c $(mysql_config --libs) 

но не с г ++. .

Что вы хотите сделать?

Редактировать: Ошибка: выход (1); не был объявлен в этой Scope

+2

Каковы ошибки? – UncleBens

+0

Пожалуйста, разместите сообщение об ошибке, которое вы получите с g ++ – Yacoby

+0

Что такое вывод g ++? –

ответ

4

Первые вещи первых: это, вероятно, будет гораздо более полезным, если вы показали нам ошибки компиляции.

Это, как говорится, мой первоначальный инстинкт предложить:

extern "C" 
{ 
    #include <mysql.h> 
    #include <stdio.h> 
    #include <string.h> 
} 

Это предположение прямо сейчас, но без фактических сообщений об ошибках, это лучшее, что вы собираетесь получить.

О, и, возможно, переименование файла для завершения в .cpp, .C++ или .C (в верхнем регистре) поможет.

+3

Нет необходимости делать это.И люди, которые используют имена файлов с учетом регистра, имеют для них специальный уголок в аду. – 2010-03-07 14:06:06

+0

Нет необходимости делать какие? Переименование файла или объявления extern «C»? Я знаю, что многие заголовки добавляют #ifdefs вокруг C++ для добавления внешних деклараций «C» внутри, но я не знаю, является ли mysql.h одним из них или нет. Без ошибок невозможно сказать. –

+0

Ах, неважно. Просто увидел редактирование. Да, с фактическим сообщением об ошибке намного легче найти ошибку. Я приведу новый ответ, объясняющий что-то здесь. –

1

использование:

extern "C" 
{ 
    YOUR CODE HERE 
} 
0
#include <stdlib.h> 

Хотя я сомневаюсь, что он действительно сказал «exit (1);». Пожалуйста, покажите точный сообщений в следующий раз.

0

Теперь я не запрограммировал C в течение длительного времени (и никогда не был на очень высоком уровне), но мне показалось странным, что вы хотите включить функцию main() в уже существующую базу кода. Это действительно компилятор или компоновщик, который жалуется? И когда вы говорите, что GCC успешно компилирует код, вы компилируете только один исходный файл или включаете его в большую базу кода?

Если моя догадка верна, вам будет полезно переименовать функцию в нечто иное, чем основное, например. connect_to_database().

1

ОК, теперь, когда дается ответ, есть несколько уроков для изучения.

Во-первых, всегда предоставляет ошибки, когда вы сообщаете о вещах, которые не компилируются. Эти сообщения содержат ценную информацию. Не перефразируйте их. Вырезать и вставить их в свой собственный блок кода.

Во-вторых, в любое время, когда вы используете функцию, проверьте документы. Я никогда не видел документацию С, которая не сообщила вам требуемый заголовочный файл вверху страницы руководства или эквивалента. Это как часть документации, так и объясняет, что делает функция. В программировании C и C++ имеется множество заголовков. В результате документирование требуемых заголовков для функций является очень распространенной идиомой документации.

Смежные вопросы