Используйте препроцессор для преобразования кода в строку - PullRequest
1 голос
/ 26 ноября 2010

Отказ от ответственности: я не программист C .

Я недавно видел проект друга.По причинам, которые я не понимаю, он пишет код в строке, которая компилируется во время выполнения.В результате получается что-то вроде:

char x[] = "int y = 5; printf(\"%i\", y)";
run_this_code(x);

Что ужасно использовать, потому что Visual Studio не вмешивается и не выделяет синтаксис и т. Д.

Используя некоторые злоупотребления препроцессором, можнообманным путем заставьте Visual Studio думать, что вы пишете реальный код, а затем препроцессор превращает его в строку до того, как компилятор овладеет вашим исходным кодом.Это работает:

#define STRINGIFY(x) #x

int main(void){
        char[] y = STRINGIFY(
                int x = 5;
                printf("%i", x);
        );
        printf("%s", y);
}

Проблема с этим заключается в том, что он печатает:

int x = 5; printf("%i\n", x);

Проблема заключается в том, что во время выполнения компилятор сообщает Ошибка в строке 1. Есть ли способ сделать это?включить новые строки?

Обновление Это не моя проблема.Это чужой код, я просто заинтересовался идеей использования препроцессора, чтобы сделать его жизнь проще.Я понятия не имею, почему он делает это так.

Обновление убрал все упоминания о CUDA, потому что этот вопрос касается препроцессора, а не CUDA.

Ответы [ 2 ]

3 голосов
/ 26 ноября 2010

При кодировании в CUDA вы должны отправить весь код на видеокарту в виде строки для компиляции.

Что заставляет вас это говорить?Взгляните на примеры CUDA SDK, вы можете поместить код CUDA в .cu файлы, которые затем компилируются с использованием nvcc.Вы можете иметь подсветку синтаксиса, intellisense и все совершенство Visual Studio!См. Руководство по программированию CUDA и этот пост для получения дополнительной информации

3 голосов
/ 26 ноября 2010

Сначала я предположил, что достаточно просто убежать от новой строки. Имея время для проверки (и увидев комментарий владельца вопроса), я понимаю, что это не сработает.

Я провел некоторое тестирование, и явно вставил символы перевода строки:

char[] y = STRINGIFY(
                int x = 5;\n
                printf("%i", x);\n
        );

Я проверял это только в Linux, но не в IDE с поддержкой синтаксиса. Вполне возможно, что эти «оголенные» переводы строк будут помечены как синтаксические ошибки с помощью умной подсветки синтаксиса.

...