Как сделать символьную строку из значения макроса C?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
49
задан Brian Tompsett - 汤莱恩 1 February 2016 в 12:01
поделиться

4 ответа

Он, кто Застенчив <глоток> * , дал Вам зачаток ответ , но только микроб. Основная техника для преобразования значения в строку в препроцессоре C является действительно через '#' оператором, но простая транслитерация предлагаемого решения получает ошибку компиляции:

#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC

#include <stdio.h>
int main(void)
{
    puts(TEST_FUNC_NAME);
    return(0);
}

синтаксическая ошибка идет, 'помещает ()' строку - проблемой является 'случайный #' в источнике.

раздел In 6.10.3.2 из стандарта C, '# оператор', говорит это:

Каждый маркер предварительной обработки # в заменяющем списке для подобного функции макроса должен сопровождаться параметром как следующий маркер предварительной обработки в заменяющем списке.

проблема состоит в том, что можно преобразовать макро-аргументы строкам - но Вы не можете преобразовать случайные объекты, которые не являются макро-аргументами.

Так, для достижения эффекта Вы после, несомненно необходимо сделать некоторую дополнительную работу.

#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME  FUNCTION_NAME(test_func)

#include <stdio.h>

int main(void)
{
    puts(TEST_FUNC_NAME);
    return(0);
}

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

#define STR_VALUE(arg)      #arg
#define FUNCTION_NAME(name) STR_VALUE(name)

#define TEST_FUNC      test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)

#include <stdio.h>

static void TEST_FUNC(void)
{
    printf("In function %s\n", TEST_FUNC_NAME);
}

int main(void)
{
    puts(TEST_FUNC_NAME);
    TEST_FUNC();
    return(0);
}
<час>

<глоток> * В то время, когда этот ответ был сначала записан, имя shoosh, используемое 'Застенчивый' в качестве части имени.

72
ответ дан Community 7 November 2019 в 11:43
поделиться

@Jonathan Leffler:Спасибо. Ваши работы решения.

А полный рабочий пример:

/** compile-time dispatch 

   $ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
*/
#include <stdio.h>

#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)

#ifndef TEST_FUN
#  define TEST_FUN some_func
#endif

#define TEST_FUN_NAME STR(TEST_FUN)

void some_func(void)
{
  printf("some_func() called\n");
}

void another_func(void)
{
  printf("do something else\n");
}

int main(void)
{
  TEST_FUN();
  printf("TEST_FUN_NAME=%s\n", TEST_FUN_NAME);
  return 0;
}

Пример:

$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
do something else
TEST_FUN_NAME=another_func
17
ответ дан jfs 7 November 2019 в 11:43
поделиться
#include <stdio.h>

#define QUOTEME(x) #x

#ifndef TEST_FUN
#  define TEST_FUN func_name
#  define TEST_FUN_NAME QUOTEME(TEST_FUN)
#endif

int main(void)
{
    puts(TEST_FUN_NAME);
    return 0;
}

Ссылка: Википедия препроцессор C страница

0
ответ дан Jason Weathered 7 November 2019 в 11:43
поделиться

#define TEST_FUN_NAME #FUNC_NAME

см. здесь

-1
ответ дан shoosh 7 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: