diff --git a/compiler/cpp/tests/CMakeLists.txt b/compiler/cpp/tests/CMakeLists.txt
index f990895..77c1524 100644
--- a/compiler/cpp/tests/CMakeLists.txt
+++ b/compiler/cpp/tests/CMakeLists.txt
@@ -41,21 +41,23 @@
 find_package(FLEX REQUIRED)
 find_package(BISON REQUIRED)
 
-# create directory for thrifty and thriftl
-file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thrift/)
+if(NOT TARGET parse)
+    # create directory for thrifty and thriftl
+    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thrift/)
 
-# Create flex and bison files and build the lib parse static library
-BISON_TARGET(thrifty ${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/thrifty.yy ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc COMPILE_FLAGS "--file-prefix-map=${CMAKE_BINARY_DIR}='' --file-prefix-map=${CMAKE_SOURCE_DIR}=''")
-FLEX_TARGET(thriftl ${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/thriftl.ll ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc)
-ADD_FLEX_BISON_DEPENDENCY(thriftl thrifty)
+    # Create flex and bison files and build the lib parse static library
+    BISON_TARGET(thrifty ${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/thrifty.yy ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc COMPILE_FLAGS "--file-prefix-map=${CMAKE_BINARY_DIR}='' --file-prefix-map=${CMAKE_SOURCE_DIR}=''")
+    FLEX_TARGET(thriftl ${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/thriftl.ll ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc)
+    ADD_FLEX_BISON_DEPENDENCY(thriftl thrifty)
 
-set(parse_SOURCES
-    ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc
-    ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc
-    ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.hh
-)
+    set(parse_SOURCES
+        ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc
+        ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc
+        ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.hh
+    )
 
-add_library(parse STATIC ${parse_SOURCES})
+    add_library(parse STATIC ${parse_SOURCES})
+endif()
 
 # Thrift compiler tests
 set(thrift_compiler_tests
@@ -72,6 +74,8 @@
 )
 
 set(thrift_compiler_SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/thrift_test_globals.cc
+    ${CMAKE_CURRENT_SOURCE_DIR}/thrift_test_parser_support.cc
     ${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/logging.cc # we use logging instead of main to avoid breaking compillation (2 main v)
     ${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/audit/t_audit.cpp
     ${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/common.cc
@@ -91,10 +95,11 @@
     option(${enabler} ${description} ${initial})
     if(${enabler})
         list(APPEND thrift_compiler_SOURCES ${src})
-        file(GLOB thrift_compiler_tests_SOURCES
+        file(GLOB temp_test_sources
             "${CMAKE_CURRENT_SOURCE_DIR}/${name}/*.c*"
             "${CMAKE_CURRENT_SOURCE_DIR}/${name}/*.thrift"
         )
+        list(APPEND thrift_compiler_tests_SOURCES ${temp_test_sources})
     endif()
 endmacro()
 
@@ -106,14 +111,14 @@
     list(APPEND "${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/generate/${name}_validator_generator.h")
     option(${enabler} ${description} ${initial})
     if(${enabler})
-        list(APPEND thrift-compiler_SOURCES ${src})
+        list(APPEND thrift_compiler_SOURCES ${src})
     endif()
 endmacro()
 
 # The following compiler with unit tests can be enabled or disabled
 THRIFT_ADD_COMPILER(c_glib  "Enable compiler for C with Glib" OFF)
 THRIFT_ADD_COMPILER(cl      "Enable compiler for Common LISP" OFF)
-THRIFT_ADD_COMPILER(cpp     "Enable compiler for C++" OFF)
+THRIFT_ADD_COMPILER(cpp     "Enable compiler for C++" ON)
 THRIFT_ADD_COMPILER(d       "Enable compiler for D" OFF)
 THRIFT_ADD_COMPILER(dart    "Enable compiler for Dart" OFF)
 THRIFT_ADD_COMPILER(delphi  "Enable compiler for Delphi" OFF)
@@ -142,11 +147,19 @@
 # The following compiler can be enabled or disabled by enabling or disabling certain languages
 THRIFT_ADD_VALIDATOR_COMPILER(go           "Enable validator compiler for Go" ON)
 
-# Thrift is looking for include files in the src directory
-# we also add the current binary directory for generated files
-include_directories(${CMAKE_CURRENT_BINARY_DIR} ${THRIFT_COMPILER_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/catch)
+# OCaml tests include the implementation .cc directly, so compiling it into the
+# thrift_compiler lib would cause duplicate definitions (LNK2005).
+list(REMOVE_ITEM thrift_compiler_SOURCES
+  "${THRIFT_COMPILER_SOURCE_DIR}/src/thrift/generate/t_ocaml_generator.cc"
+)
 
-add_library(thrift_compiler ${thrift_compiler_SOURCES})
+# Thrift is looking for include files in the src directory
+# We also add:
+# - the current binary directory for locally generated files (standalone tests build)
+# - the top-level binary directory for generated files when reusing targets from the parent build
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} ${THRIFT_COMPILER_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/catch)
+
+add_library(thrift_compiler STATIC ${thrift_compiler_SOURCES})
 
 #link parse lib to thrift_compiler lib
 target_link_libraries(thrift_compiler parse)
@@ -162,7 +175,93 @@
 set_target_properties(thrift_compiler_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY bin/)
 set_target_properties(thrift_compiler_tests PROPERTIES OUTPUT_NAME thrift_compiler_tests)
 
-target_link_libraries(thrift_compiler_tests thrift_compiler)
+# Ensure generator registration translation units are linked in.
+# Many generators register themselves via static initialization; linkers may
+# otherwise discard those objects from static libraries.
+if(MSVC)
+    target_link_libraries(thrift_compiler_tests PRIVATE thrift_compiler)
+    target_link_options(thrift_compiler_tests PRIVATE
+        "/WHOLEARCHIVE:$<TARGET_LINKER_FILE:thrift_compiler>"
+    )
+elseif(APPLE)
+    target_link_libraries(thrift_compiler_tests PRIVATE thrift_compiler)
+    target_link_options(thrift_compiler_tests PRIVATE
+        "-Wl,-force_load,$<TARGET_LINKER_FILE:thrift_compiler>"
+    )
+else()
+    target_link_libraries(thrift_compiler_tests PRIVATE
+        "-Wl,--whole-archive" thrift_compiler "-Wl,--no-whole-archive"
+    )
+endif()
+
+# Compile-check generated C++ output for the fixture thrift file with private_optional enabled.
+# This ensures the generator output is compileable (no link step required).
+if(TARGET thrift-compiler)
+    # Generated C++ includes Thrift runtime headers which may require Boost.
+    # Only enable the compile-check when Boost headers are available.
+    set(_private_optional_boost_include_dirs "")
+    find_package(Boost QUIET)
+    if(Boost_FOUND)
+        set(_private_optional_boost_include_dirs ${Boost_INCLUDE_DIRS})
+    elseif(DEFINED BOOST_ROOT)
+        if(EXISTS "${BOOST_ROOT}/include/boost")
+            set(_private_optional_boost_include_dirs "${BOOST_ROOT}/include")
+        elseif(EXISTS "${BOOST_ROOT}/boost")
+            set(_private_optional_boost_include_dirs "${BOOST_ROOT}")
+        endif()
+    endif()
+
+    if(_private_optional_boost_include_dirs STREQUAL "")
+        message(STATUS "Skipping generated private_optional compile-check (Boost headers not found)")
+    else()
+    set(_private_optional_thrift
+        "${CMAKE_CURRENT_SOURCE_DIR}/cpp/test_private_optional.thrift"
+    )
+    set(_private_optional_gen_out_dir
+        "${CMAKE_CURRENT_BINARY_DIR}/generated-private-optional"
+    )
+    set(_private_optional_gen_cpp_dir
+        "${_private_optional_gen_out_dir}/gen-cpp"
+    )
+    set(_private_optional_types_cpp
+        "${_private_optional_gen_cpp_dir}/test_private_optional_types.cpp"
+    )
+
+    add_custom_command(
+        OUTPUT "${_private_optional_types_cpp}"
+        COMMAND ${CMAKE_COMMAND} -E make_directory "${_private_optional_gen_out_dir}"
+        COMMAND ${CMAKE_COMMAND} -E chdir "${_private_optional_gen_out_dir}"
+            $<TARGET_FILE:thrift-compiler>
+            --gen cpp:private_optional
+            -o "${_private_optional_gen_out_dir}"
+            "${_private_optional_thrift}"
+        DEPENDS thrift-compiler "${_private_optional_thrift}"
+        VERBATIM
+    )
+
+    set_source_files_properties(
+        "${_private_optional_types_cpp}"
+        PROPERTIES GENERATED TRUE
+    )
+
+    add_library(thrift_compiler_generated_private_optional STATIC
+        "${_private_optional_types_cpp}"
+    )
+
+    target_include_directories(thrift_compiler_generated_private_optional PRIVATE
+        "${_private_optional_gen_cpp_dir}"
+        "${THRIFT_COMPILER_SOURCE_DIR}/../../lib/cpp/src"
+        "${CMAKE_CURRENT_BINARY_DIR}"
+        "${CMAKE_BINARY_DIR}"
+        ${_private_optional_boost_include_dirs}
+    )
+
+    # Build the compile-check as part of the standard test build.
+    add_dependencies(thrift_compiler_tests thrift_compiler_generated_private_optional)
+    endif()
+else()
+    message(STATUS "Skipping generated private_optional compile-check (no thrift-compiler target)")
+endif()
 
 enable_testing()
-add_test(NAME ThriftTests COMMAND thrift_compiler_tests)
+add_test(NAME ThriftCompilerTests COMMAND thrift_compiler_tests)
diff --git a/compiler/cpp/tests/cpp/expected_TestStruct_default.txt b/compiler/cpp/tests/cpp/expected_TestStruct_default.txt
new file mode 100644
index 0000000..bce1685
--- /dev/null
+++ b/compiler/cpp/tests/cpp/expected_TestStruct_default.txt
@@ -0,0 +1,52 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+class TestStruct : public virtual ::apache::thrift::TBase {
+ public:
+
+  TestStruct(const TestStruct&);
+  TestStruct& operator=(const TestStruct&);
+  TestStruct() noexcept;
+
+  virtual ~TestStruct() noexcept;
+  int32_t required_field;
+  int32_t optional_field;
+  int32_t default_field;
+  std::string optional_string;
+
+  _TestStruct__isset __isset;
+
+  void __set_required_field(const int32_t val);
+
+  void __set_optional_field(const int32_t val);
+
+  void __set_default_field(const int32_t val);
+
+  void __set_optional_string(const std::string& val);
+
+  bool operator == (const TestStruct & rhs) const;
+  bool operator != (const TestStruct &rhs) const {
+    return !(*this == rhs);
+  }
+
+  bool operator < (const TestStruct & ) const;
+
+  uint32_t read(::apache::thrift::protocol::TProtocol* iprot) override;
+  uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const override;
+
+  virtual void printTo(std::ostream& out) const;
+};
diff --git a/compiler/cpp/tests/cpp/expected_TestStruct_private_optional.txt b/compiler/cpp/tests/cpp/expected_TestStruct_private_optional.txt
new file mode 100644
index 0000000..7c42909
--- /dev/null
+++ b/compiler/cpp/tests/cpp/expected_TestStruct_private_optional.txt
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+class TestStruct : public virtual ::apache::thrift::TBase {
+ public:
+
+  TestStruct(const TestStruct&);
+  TestStruct& operator=(const TestStruct&);
+  TestStruct() noexcept;
+
+  virtual ~TestStruct() noexcept;
+  int32_t required_field;
+  int32_t default_field;
+
+  _TestStruct__isset __isset;
+
+  void __set_required_field(const int32_t val);
+
+  void __set_optional_field(const int32_t val);
+
+  void __set_default_field(const int32_t val);
+
+  void __set_optional_string(const std::string& val);
+
+  const int32_t& __get_required_field() const { return required_field; }
+
+  const int32_t& __get_optional_field() const { return optional_field; }
+
+  const int32_t& __get_default_field() const { return default_field; }
+
+  const std::string& __get_optional_string() const { return optional_string; }
+
+  bool operator == (const TestStruct & rhs) const;
+  bool operator != (const TestStruct &rhs) const {
+    return !(*this == rhs);
+  }
+
+  bool operator < (const TestStruct & ) const;
+
+  uint32_t read(::apache::thrift::protocol::TProtocol* iprot) override;
+  uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const override;
+
+  virtual void printTo(std::ostream& out) const;
+
+ private:
+  int32_t optional_field;
+  std::string optional_string;
+
+  friend void swap(TestStruct &a, TestStruct &b) noexcept;
+
+  friend std::ostream& operator<<(std::ostream& out, const TestStruct& obj);
+};
diff --git a/compiler/cpp/tests/cpp/t_cpp_generator_private_optional_tests.cc b/compiler/cpp/tests/cpp/t_cpp_generator_private_optional_tests.cc
new file mode 100644
index 0000000..9f48229
--- /dev/null
+++ b/compiler/cpp/tests/cpp/t_cpp_generator_private_optional_tests.cc
@@ -0,0 +1,230 @@
+// Licensed to the Apache Software Foundation(ASF) under one
+// or more contributor license agreements.See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "../catch/catch.hpp"
+#include <thrift/parse/t_program.h>
+#include <thrift/generate/t_generator.h>
+#include <thrift/generate/t_generator_registry.h>
+#include <thrift/globals.h>
+#include <thrift/main.h>
+#include <fstream>
+#include <memory>
+#include <string>
+#include <sstream>
+
+#include <algorithm>
+
+using std::string;
+using std::map;
+using std::ifstream;
+using std::ofstream;
+using std::ostringstream;
+
+// Provided by compiler/cpp/tests/thrift_test_parser_support.cc
+extern std::string g_curdir;
+extern std::string g_curpath;
+
+// Helper function to read file content
+string read_file(const string& filename) {
+    ifstream file(filename);
+    if (!file.is_open()) {
+        return "";
+    }
+    ostringstream ss;
+    ss << file.rdbuf();
+    return ss.str();
+}
+
+static string source_dir() {
+    string file = __FILE__;
+    std::replace(file.begin(), file.end(), '\\', '/');
+    size_t slash = file.rfind('/');
+    return (slash == string::npos) ? string(".") : file.substr(0, slash);
+}
+
+static string join_path(const string& a, const string& b) {
+    if (a.empty()) {
+        return b;
+    }
+    if (a.back() == '/' || a.back() == '\\') {
+        return a + b;
+    }
+    return a + "/" + b;
+}
+
+static string normalize_for_compare(string s) {
+    s.erase(std::remove(s.begin(), s.end(), '\r'), s.end());
+
+    std::istringstream in(s);
+    std::ostringstream out;
+    string line;
+    bool in_block_comment = false;
+    bool first = true;
+    while (std::getline(in, line)) {
+        while (!line.empty() && (line.back() == ' ' || line.back() == '\t')) {
+            line.pop_back();
+        }
+
+        const auto first_non_ws = line.find_first_not_of(" \t");
+        if (first_non_ws == string::npos) {
+            continue;
+        }
+
+        const string trimmed = line.substr(first_non_ws);
+
+        if (in_block_comment) {
+            if (trimmed.find("*/") != string::npos) {
+                in_block_comment = false;
+            }
+            continue;
+        }
+
+        if (trimmed.size() >= 2 && trimmed.compare(0, 2, "//") == 0) {
+            continue;
+        }
+
+        if (trimmed.size() >= 2 && trimmed.compare(0, 2, "/*") == 0) {
+            if (trimmed.find("*/") == string::npos) {
+                in_block_comment = true;
+            }
+            continue;
+        }
+
+        if (!first) {
+            out << '\n';
+        }
+        first = false;
+        out << line;
+    }
+
+    return out.str();
+}
+
+// Helper function to extract class definition from generated header
+string extract_class_definition(const string& content, const string& class_name) {
+    size_t class_start = content.find("class " + class_name + " :");
+    if (class_start == string::npos) {
+        return "";
+    }
+    
+    size_t class_end = content.find("};", class_start);
+    if (class_end == string::npos) {
+        return "";
+    }
+    
+    return content.substr(class_start, class_end - class_start + 2);
+}
+
+static void parse_thrift_for_test(t_program* program) {
+    REQUIRE(program != nullptr);
+
+    // These globals are used by the parser; see thrift/globals.h.
+    g_program = program;
+    g_scope = program->scope();
+    g_parent_scope = nullptr;
+    g_parent_prefix = program->get_name() + ".";
+
+    g_curpath = program->get_path();
+    g_curdir = directory_name(g_curpath);
+
+    // Pass 1: scan includes (even if none) to match the compiler behavior.
+    g_parse_mode = INCLUDES;
+    yylineno = 1;
+    yyin = std::fopen(g_curpath.c_str(), "r");
+    REQUIRE(yyin != nullptr);
+    REQUIRE(yyparse() == 0);
+    std::fclose(yyin);
+    yyin = nullptr;
+
+    // Pass 2: parse program.
+    g_parse_mode = PROGRAM;
+    yylineno = 1;
+    yyin = std::fopen(g_curpath.c_str(), "r");
+    REQUIRE(yyin != nullptr);
+    REQUIRE(yyparse() == 0);
+    std::fclose(yyin);
+    yyin = nullptr;
+}
+
+TEST_CASE("t_cpp_generator default behavior generates all public fields", "[functional]")
+{
+    string path = join_path(source_dir(), "test_private_optional.thrift");
+    string name = "test_private_optional";
+    map<string, string> parsed_options = {}; // No private_optional flag
+    string option_string = "";
+
+    std::unique_ptr<t_program> program(new t_program(path, name));
+    parse_thrift_for_test(program.get());
+    
+    std::unique_ptr<t_generator> gen(
+        t_generator_registry::get_generator(program.get(), "cpp", parsed_options, option_string));
+    REQUIRE(gen != nullptr);
+    
+    // Generate code
+    REQUIRE_NOTHROW(gen->generate_program());
+
+    // Read generated output
+    string generated_file = "gen-cpp/test_private_optional_types.h";
+    string generated_content = read_file(generated_file);
+    REQUIRE(!generated_content.empty());
+
+    // Compare generated class definition against the expected fixture.
+    string class_def = extract_class_definition(generated_content, "TestStruct");
+    REQUIRE(!class_def.empty());
+
+    string expected_path = join_path(source_dir(), "expected_TestStruct_default.txt");
+    string expected_content = read_file(expected_path);
+    REQUIRE(!expected_content.empty());
+
+    REQUIRE(normalize_for_compare(class_def) == normalize_for_compare(expected_content));
+    
+}
+
+TEST_CASE("t_cpp_generator with private_optional generates private optional fields", "[functional]")
+{
+    string path = join_path(source_dir(), "test_private_optional.thrift");
+    string name = "test_private_optional";
+    map<string, string> parsed_options = {{"private_optional", ""}};
+    string option_string = "";
+
+    std::unique_ptr<t_program> program(new t_program(path, name));
+    parse_thrift_for_test(program.get());
+    
+    std::unique_ptr<t_generator> gen(
+        t_generator_registry::get_generator(program.get(), "cpp", parsed_options, option_string));
+    REQUIRE(gen != nullptr);
+    
+    // Generate code
+    REQUIRE_NOTHROW(gen->generate_program());
+
+    // Read generated output
+    string generated_file = "gen-cpp/test_private_optional_types.h";
+    string generated_content = read_file(generated_file);
+    REQUIRE(!generated_content.empty());
+
+    // Extract class definition
+    string class_def = extract_class_definition(generated_content, "TestStruct");
+    REQUIRE(!class_def.empty());
+
+    // Compare generated class definition against the expected fixture.
+    string expected_path = join_path(source_dir(), "expected_TestStruct_private_optional.txt");
+    string expected_content = read_file(expected_path);
+    REQUIRE(!expected_content.empty());
+
+    REQUIRE(normalize_for_compare(class_def) == normalize_for_compare(expected_content));
+    
+}
diff --git a/compiler/cpp/tests/cpp/test_private_optional.thrift b/compiler/cpp/tests/cpp/test_private_optional.thrift
new file mode 100644
index 0000000..8801838
--- /dev/null
+++ b/compiler/cpp/tests/cpp/test_private_optional.thrift
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace cpp test.private_optional
+
+struct TestStruct {
+  1: required i32 required_field;
+  2: optional i32 optional_field;
+  3: i32 default_field;
+  4: optional string optional_string;
+}
diff --git a/compiler/cpp/tests/ocaml/snapshot_exception_types_i.cc b/compiler/cpp/tests/ocaml/snapshot_exception_types_i.hpp
similarity index 100%
rename from compiler/cpp/tests/ocaml/snapshot_exception_types_i.cc
rename to compiler/cpp/tests/ocaml/snapshot_exception_types_i.hpp
diff --git a/compiler/cpp/tests/ocaml/snapshot_service_handle_ex.cc b/compiler/cpp/tests/ocaml/snapshot_service_handle_ex.hpp
similarity index 100%
rename from compiler/cpp/tests/ocaml/snapshot_service_handle_ex.cc
rename to compiler/cpp/tests/ocaml/snapshot_service_handle_ex.hpp
diff --git a/compiler/cpp/tests/ocaml/t_ocaml_generator_tests.cc b/compiler/cpp/tests/ocaml/t_ocaml_generator_tests.cc
index ea788fc..a09b8fa 100644
--- a/compiler/cpp/tests/ocaml/t_ocaml_generator_tests.cc
+++ b/compiler/cpp/tests/ocaml/t_ocaml_generator_tests.cc
@@ -83,7 +83,7 @@
     });
 
     {
-        #include "snapshot_exception_types_i.cc"
+        #include "snapshot_exception_types_i.hpp"
         REQUIRE( snapshot == errors_gen.types_i() );
     }
 
@@ -105,7 +105,7 @@
     });
 
     {
-        #include "snapshot_service_handle_ex.cc"
+        #include "snapshot_service_handle_ex.hpp"
         REQUIRE( snapshot == service_gen.service() );
     }
 }
diff --git a/compiler/cpp/tests/tests_main.cc b/compiler/cpp/tests/tests_main.cc
index 21d09b9..16cba7e 100644
--- a/compiler/cpp/tests/tests_main.cc
+++ b/compiler/cpp/tests/tests_main.cc
@@ -15,5 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#define CATCH_CONFIG_MAIN
+#define CATCH_CONFIG_NO_POSIX_SIGNALS
+#define CATCH_CONFIG_RUNNER
 #include "catch/catch.hpp"
+
+#include "thrift/common.h"
+
+int main(int argc, char* argv[]) {
+	initGlobals();
+	int result = Catch::Session().run(argc, argv);
+	clearGlobals();
+	return result;
+}
diff --git a/compiler/cpp/tests/thrift_test_globals.cc b/compiler/cpp/tests/thrift_test_globals.cc
new file mode 100644
index 0000000..a195958
--- /dev/null
+++ b/compiler/cpp/tests/thrift_test_globals.cc
@@ -0,0 +1,45 @@
+// Licensed to the Apache Software Foundation(ASF) under one
+// or more contributor license agreements.See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// Minimal global definitions needed when building compiler tests without src/thrift/main.cc
+
+#include "thrift/globals.h"
+
+#include <string>
+#include <vector>
+
+// Additional globals normally defined in src/thrift/main.cc
+t_program* g_program = nullptr;
+t_scope* g_scope = nullptr;
+t_scope* g_parent_scope = nullptr;
+std::string g_parent_prefix;
+PARSE_MODE g_parse_mode = PROGRAM;
+
+int g_strict = 127;
+
+char* g_time_str = nullptr;
+char* g_doctext = nullptr;
+char* g_program_doctext_candidate = nullptr;
+
+int g_allow_neg_field_keys = 0;
+int g_allow_64bit_consts = 0;
+
+std::string g_curdir;
+std::string g_curpath;
+std::vector<std::string> g_incl_searchpath;
+
+bool g_return_failure = false;
diff --git a/compiler/cpp/tests/thrift_test_parser_support.cc b/compiler/cpp/tests/thrift_test_parser_support.cc
new file mode 100644
index 0000000..c70902d
--- /dev/null
+++ b/compiler/cpp/tests/thrift_test_parser_support.cc
@@ -0,0 +1,149 @@
+// Licensed to the Apache Software Foundation(ASF) under one
+// or more contributor license agreements.See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// Minimal parser support for compiler unit tests.
+//
+// The Bison grammar (thrifty.yy) references a set of functions and globals that
+// are normally provided by src/thrift/main.cc. The compiler unit tests build
+// does not compile main.cc (it would conflict with the Catch2 main), but some
+// tests still need to parse .thrift files.
+//
+// This file provides lightweight implementations sufficient for unit tests.
+
+
+#include "thrift/globals.h"
+#include "thrift/main.h"
+
+#include <algorithm>
+#include <cstdarg>
+#include <cstdio>
+#include <cstdlib>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+// Provided by compiler/cpp/tests/thrift_test_globals.cc (not declared in public headers)
+extern std::string g_curdir;
+extern std::string g_curpath;
+extern std::vector<std::string> g_incl_searchpath;
+
+// Error reporting used by the parser.
+void yyerror(const char* fmt, ...) {
+  std::fprintf(stderr, "[ERROR:%s:%d] ", g_curpath.c_str(), yylineno);
+  va_list args;
+  va_start(args, fmt);
+  std::vfprintf(stderr, fmt, args);
+  va_end(args);
+  std::fprintf(stderr, "\n");
+
+  throw std::runtime_error("thrift parser error");
+}
+
+// Simplified helpers referenced by the grammar.
+std::string program_name(std::string filename) {
+  filename.erase(std::remove(filename.begin(), filename.end(), '\\'), filename.end());
+  std::string::size_type slash = filename.rfind('/');
+  if (slash != std::string::npos) {
+    filename = filename.substr(slash + 1);
+  }
+  std::string::size_type dot = filename.rfind('.');
+  if (dot != std::string::npos) {
+    filename = filename.substr(0, dot);
+  }
+  return filename;
+}
+
+std::string directory_name(std::string filename) {
+  std::replace(filename.begin(), filename.end(), '\\', '/');
+  std::string::size_type slash = filename.rfind('/');
+  if (slash == std::string::npos) {
+    return ".";
+  }
+  return filename.substr(0, slash);
+}
+
+std::string include_file(std::string filename) {
+  // Unit tests only parse fixtures without includes. Provide a best-effort
+  // resolution to satisfy the linker and any unexpected includes.
+  if (!filename.empty() && (filename[0] == '/' || filename.find(":/") != std::string::npos)) {
+    return filename;
+  }
+  // Search current dir first.
+  if (!g_curdir.empty()) {
+    return g_curdir + "/" + filename;
+  }
+  return filename;
+}
+
+void clear_doctext() {
+  if (g_doctext != nullptr) {
+    std::free(g_doctext);
+    g_doctext = nullptr;
+  }
+}
+
+char* clean_up_doctext(char* doctext) {
+  // Keep behavior minimal for unit tests.
+  return doctext;
+}
+
+void declare_valid_program_doctext() {
+  if ((g_program_doctext_candidate != nullptr) && (g_program_doctext_status == STILL_CANDIDATE)) {
+    g_program_doctext_status = ABSOLUTELY_SURE;
+  } else {
+    g_program_doctext_status = NO_PROGRAM_DOCTEXT;
+  }
+}
+
+void validate_simple_identifier(const char* identifier) {
+  if (identifier == nullptr) {
+    return;
+  }
+  const std::string name(identifier);
+  if (name.find('.') != std::string::npos) {
+    yyerror("Identifier %s can't have a dot.", identifier);
+  }
+}
+
+void validate_const_type(t_const* /*c*/) {
+  // Not needed for current unit tests.
+}
+
+void validate_field_value(t_field* /*field*/, t_const_value* /*cv*/) {
+  // Not needed for current unit tests.
+}
+
+bool validate_throws(t_struct* /*throws*/) {
+  return true;
+}
+
+void check_for_list_of_bytes(t_type* /*list_elem_type*/) {
+  // Not needed for current unit tests.
+}
+
+void emit_byte_type_warning() {
+  // Not needed for current unit tests.
+}
+
+void error_unsupported_namespace_decl(const char* old_form, const char* new_form) {
+  // Treat as fatal in unit tests.
+  if (new_form == nullptr) {
+    yyerror("Unsupported declaration '%s_namespace'", old_form);
+  } else {
+    yyerror("Unsupported declaration '%s'", old_form);
+  }
+}
