Проблема состоит в том, что с целым числом, компилятор обычно никогда не должен создавать адрес памяти для константы. Это не существует во времени выполнения, и каждое использование его встраивается в окружающий код. Это может все еще решить дать ему ячейку памяти - если ее адрес когда-либо берется (или если это передается ссылкой константы на функцию), что это должно. Чтобы дать ему адрес, это должно быть определено в некоторой единице перевода. И в этом случае, необходимо разделить объявление от определения, так как иначе это определить в нескольких единицах перевода.
Используя g ++ без оптимизации (-O0
), это автоматически встраивает постоянные целочисленные переменные, но не постоянные двойные значения. На более высоких уровнях оптимизации (например, -O1
), это встраивает постоянный, удваивается. Таким образом следующий код компилирует в -O1
, но НЕ в -O0
:
// File a.h
class X
{
public:
static const double d = 1.0;
};
void foo(void);
// File a.cc
#include <stdio.h>
#include "a.h"
int main(void)
{
foo();
printf("%g\n", X::d);
return 0;
}
// File b.cc
#include <stdio.h>
#include "a.h"
void foo(void)
{
printf("foo: %g\n", X::d);
}
Командная строка:
g++ a.cc b.cc -O0 -o a # Linker error: ld: undefined symbols: X::d
g++ a.cc b.cc -O1 -o a # Succeeds
Для максимальной мобильности, необходимо объявить константы в заголовочных файлах и определить их однажды в некотором исходном файле. Без оптимизации это не повредит производительность, так как Вы не оптимизируете так или иначе, но с включенной оптимизацией, это может повредить производительность, так как компилятор больше не может встраивать те константы в другие исходные файлы, если Вы не включаете "целую оптимизацию программы".
Вы пробовали передавать параметры компилятора ? [-кодирование UTF-8]
Обновление: судя по вашим комментариям, это проблема времени выполнения, а не компиляции. В качестве обходного пути вы можете попробовать экранировать символ как Unicode.
т.е. изменить символ на '\ uXXXX' в файле clojure, где XXXX - это точка Unicode в шестнадцатеричном формате.
Если ваша проблема возникает в вашем устройстве тесты. Вы можете настроить плагин surefire, установив свойство argLine . Это позволяет вам устанавливать произвольные параметры JVM в командной строке.
Вы установили параметр через подключаемый модуль компилятора следующим образом?
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-Dfile.encoding=UTF8</compilerArgument>
</configuration>
</plugin>
</plugins>
Учитывая тот факт, что Clojure на самом деле жестко кодирует ожидаемую кодировку входных файлов в UTF8 (см. Src / jvm / clojure / lang / Compiler.java, loadFile
-метод), Я удивлен, что использование file.encoding
действительно имеет какой-либо эффект.
Попробуйте добавить это свойство для вашей помпы UTF-8